SQL Server:尽管已授予权限,但插入权限被拒绝

SQL Server:尽管已授予权限,但插入权限被拒绝

我的 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

我们最终还是解决了这个问题。我们的管理员以为他已经查看了所有相关用户,但结果发现他漏掉了一个权限被拒绝的用户组。这推翻了所有授予的编辑数据的权限。

但还是非常感谢这个脚本。它很可能在未来的案例中派上用场。

相关内容