我正在运行从数据库 X 到数据库 Y 的过程。
在数据库 Y 上应该有来自用户的插入。
在这张图片中,第一列是登录名,第二列是拥有所有必要权限的角色(它在我们需要的表上有 INSERT)。
登录名已正确分配给角色,并且该角色具有所有必要的权限。
但是当我执行该过程时,我收到了那些著名的错误:
Msg 229, Level 14, State 5, Procedure PROCEDURENAME, Line 165 [Batch Start Line 2]
The INSERT permission was denied on the object 'XXXXXXXXXXX', database 'DB', schema 'dbo'.
Msg 229, Level 14, State 5, Procedure PROCEDURENAME, Line 484 [Batch Start Line 2]
The INSERT permission was denied on the object 'YYYYYYYYYYYYYY', database 'DB', schema 'dbo'.
Msg 229, Level 14, State 5, Procedure PROCEDURENAME, Line 527 [Batch Start Line 2]
The INSERT permission was denied on the object 'YYYYYYYYYYYYYY', database 'DB', schema 'dbo'.
Msg 229, Level 14, State 5, Procedure PROCEDURENAME, Line 570 [Batch Start Line 2]
The INSERT permission was denied on the object 'YYYYYYYYYYYYYY', database 'DB', schema 'dbo'.
我创建了另一个测试登录,提供了完全相同的权限并且它工作。
如何找到阻止此登录的插入的内容?我什至跑了一个跟踪,看看我是否能找到更多的错误,在 eventviewer 上也没有。
登录没有明确的权限。它只是具有权限的角色的成员身份。
角色权限正确:
编辑:
自从重新创建 Windows 登录并重做所有权限以来,我尝试了一切。我注意到的是:
我可以创建一个登录名(使用密码的 sql 登录名)并且它有效。
我尝试使用原始 Windows 登录名在表中插入数据,但失败了,然后我将其从 ROLE 中删除并授予它 INSERT 权限,但它仍然失败。即使对数据库具有插入权限,它也无法插入数据。
如果问题出在 Windows 登录,使用 SQL Server 登录进行测试将无济于事。这是因为 Windows 登录能够通过多个来源(本身和/或一个或多个 Windows 组)进行身份验证。
Windows 登录如何进行身份验证?
sys.sys.server_principals
),sys.server_principals
,但是一个或多个在 中有条目的组的成员sys.server_principals
),对于 Windows 登录,将查看所有可能的身份验证方式中的所有
GRANT
s 和s。DENY
即使在 SQL Server 中为此 Windows 登录创建了显式登录,也不会取消或优先于与它们所属的任何 Windows 组关联的任何权限,这些权限也被列为登录。可能是一个或多个 Windows / AD 组中的成员具有某种DENY
或其他限制,并且这些限制优先于GRANT
s。NET USER {login}
通过命令提示符列出组。OP 回复:
这并不能消除问题,但它确实确定了问题的原因,因此现在有望得到解决。
一种可能的解决方案是使用模块签名(链接到我的信息站点),尽管我必须进行测试以查看它如何处理
DENY
优先级的 a 。无论哪种方式,您都不需要弄乱角色和对对象的直接权限,因此即使遇到由DENY
.使用
ScriptLoginPermissions
存储过程,将其部署到任何用户数据库:https://github.com/aleksey-vitsko/Database-Administrator-Tools/blob/master/Permissions%20-%20ScriptLoginPermissions.sql
运行它指定登录名:
除了显示此帐户的所有权限外,此 SP 还将显示组成员身份,包括 AD/Windows 组
然后您应该检查是否有任何 AD 组对相关表具有 DENY 权限
这次运行 SP 指定组名: