我在服务器级别创建了一个名为TestUser的登录用户,该用户被分配给只读角色,现在我需要在MyDb上为TestUser登录创建一个用户。
USE [MyDB]
GO
CREATE USER [Test] FOR LOGIN [TestUser]
GO
GRANT SELECT TO [Test]
GO
DENY DELETE TO [Test]
GO
DENY INSERT TO [Test]
GO
DENY UPDATE TO [Test]
GO一切都很好,但是当我编写测试用户创建的脚本时,我在任何地方都看不到我给出的脚本,并拒绝插入、删除和更新
发布于 2019-03-22 07:54:51
我在服务器级别创建了一个名为TestUser的登录用户,该用户被分配给只读角色。
没有任何fixed server role可以称为“只读角色”。
也许你的@@version >= 2014和你给了select all user securables你的登录?
如果是这样,则可以这样看待此服务器级权限:
select class_desc, permission_name, state_desc
from sys.server_permissions
where suser_name(grantee_principal_id) = 'Test';
---------------------------------------------------
--class_desc permission_name state_desc
--SERVER CONNECT SQL GRANT
--SERVER SELECT ALL USER SECURABLES GRANT然后,您做了一些不必要的grant/deny,您不应该这样做。当您映射具有select all user securables的登录名时,该用户已经访问了此数据库中的任何数据,因此不需要附加的SELECT权限。
此外,不需要deny其他权限,因为新创建的user没有任何permission。
但是,如果要检查它们是否为granted/denied,则应从sys.database_permissions中选择如下所示:
select class_desc, permission_name, state_desc
from sys.database_permissions
where user_name(grantee_principal_id) = 'Test';
---------------------------------------------------
--class_desc permission_name state_desc
--DATABASE CONNECT GRANT
--DATABASE DELETE DENY
--DATABASE INSERT DENY
--DATABASE SELECT GRANT
--DATABASE UPDATE DENY您可以使用server level permissions / sys.database_permissions来编写sys.server_permissions和database level permissions脚本,在简单的情况下,当可安全的是database时,脚本可以如下所示:
select state_desc +' ' + permission_name + ' to Test'
from sys.database_permissions
where user_name(grantee_principal_id) = 'Test'
and permission_name <> 'connect';下面是要测试的完整脚本:
create login Test with password = '*****', check_policy = off;
grant select all user securables to Test;
select class_desc, permission_name, state_desc
from sys.server_permissions
where suser_name(grantee_principal_id) = 'Test';
---------------------------------------------------
--class_desc permission_name state_desc
--SERVER CONNECT SQL GRANT
--SERVER SELECT ALL USER SECURABLES GRANT
use MyDB;
create user Test from login Test;
select class_desc, permission_name, state_desc
from sys.database_permissions
where user_name(grantee_principal_id) = 'Test';
---------------------------------------------------
--class_desc permission_name state_desc
--DATABASE CONNECT GRANT
GRANT SELECT TO [Test]
GO
DENY DELETE TO [Test]
GO
DENY INSERT TO [Test]
GO
DENY UPDATE TO [Test]
GO
select class_desc, permission_name, state_desc
from sys.database_permissions
where user_name(grantee_principal_id) = 'Test';
---------------------------------------------------
--class_desc permission_name state_desc
--DATABASE CONNECT GRANT
--DATABASE DELETE DENY
--DATABASE INSERT DENY
--DATABASE SELECT GRANT
--DATABASE UPDATE DENY
select state_desc +' ' + permission_name + ' to Test'
from sys.database_permissions
where user_name(grantee_principal_id) = 'Test'
and permission_name <> 'connect';发布于 2019-03-21 19:39:58
很可能是因为您正在使用generate脚本方法来这样做。
我建议使用开源DBA工具查看权限或导出。
别名:
将用户创建及其权限导出到to文件或主机。
将用户创建及其权限导出到to文件或主机。导出包括用户、创建和添加角色(S)、数据库级权限、对象级权限。
示例:
PS C:> Export sqlserver2014a -User User1,User2 -Path C:\temp\users.sql
只将用户User1和User2从sqlserver2014a导出到文件C:\temp\users.sql
https://dba.stackexchange.com/questions/232788
复制相似问题