![SQL Server:尽管已授予权限,但插入权限被拒绝](https://linux22.com/image/1589894/SQL%20Server%EF%BC%9A%E5%B0%BD%E7%AE%A1%E5%B7%B2%E6%8E%88%E4%BA%88%E6%9D%83%E9%99%90%EF%BC%8C%E4%BD%86%E6%8F%92%E5%85%A5%E6%9D%83%E9%99%90%E8%A2%AB%E6%8B%92%E7%BB%9D.png)
我的 IT/DB 管理员和我在 SQL Server 上遇到了权限问题。
在许多数据库上我都收到“INSERT 权限被拒绝”的提示,尽管我个人已被授予 INSERT 权限,并且是 AD 中也具有该权限的组用户的成员。
我对 SELECT、CREATE、ALTER 和 DELETE 的权限可以正常工作,但是对操作数据(INSERT 和 UPDATE)的权限虽然被授予,但却失败了。
权限是针对整个数据库授予的,但我们也尝试过针对特定表授予权限。这没什么区别。
我们尝试创建一个新的数据库并授予相同的权限。在这里我可以毫无问题地进行 INSERT。
我们曾尝试删除我的个人用户,以便我只拥有通过该组授予的授权,但这没有帮助。
数据库管理员可以像其他特定用户一样操作数据,但是当管理员尝试以组成员的身份进行操作时,他也会被拒绝权限。
我们不知道该怎么办。欢迎提出任何想法。
答案1
您确定您对特定数据库对象拥有什么权限吗?
使用下面这两个脚本,只是为了找出实际存在的权限 -DENY
如果您担心这一点,这也将包括任何权限。
如果您需要更多详细信息,请点击以下链接:
--use MY_DATABASE
--go
SELECT
state_desc + ' ' + permission_name +
' on ['+ ss.name + '].[' + so.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN sys.objects AS so
ON sdp.major_id = so.OBJECT_ID
JOIN SYS.SCHEMAS AS ss
ON so.SCHEMA_ID = ss.SCHEMA_ID
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1
--AND so.name = 'my-table_name'
UNION
SELECT
state_desc + ' ' + permission_name +
' on Schema::['+ ss.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN SYS.SCHEMAS AS ss
ON sdp.major_id = ss.SCHEMA_ID
--AND sdp.class_desc = 'my_schema'
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1
order by [Permissions T-SQL]
GO
--use MY_DATABASE
--go
SELECT
(
dp.state_desc + ' ' +
dp.permission_name collate latin1_general_cs_as +
' ON ' + '[' + s.name + ']' + '.' + '[' + o.name + ']' +
' TO ' + '[' + dpr.name + ']'
) AS GRANT_STMT
FROM sys.database_permissions AS dp
INNER JOIN sys.objects AS o ON dp.major_id=o.object_id
INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id
WHERE 1=1
AND dpr.name NOT IN ('public','guest')
-- AND o.name IN ('My_Procedure') -- Uncomment to filter to specific object(s)
--AND dp.permission_name='INSERT' -- Uncomment to filter to just the EINSERTs
答案2
我们最终还是解决了这个问题。我们的管理员以为他已经查看了所有相关用户,但结果发现他漏掉了一个权限被拒绝的用户组。这推翻了所有授予的编辑数据的权限。
但还是非常感谢这个脚本。它很可能在未来的案例中派上用场。