[英]How GRANT EXECUTE and cross-database reference works in SQL Server?
我有2个数据库,我们将它们称为Database1和Database2 ,一个权限非常有限的用户,将其称为User1 ,在Database1中将存储过程称为Proc1 。
我向Proc1上的User1授予EXECUTE
权限; GRANT EXECUTE ON [dbo].[Proc1] TO [User1]
,只要所有引用的表(用于SELECT,UPDATE等)都在Database1中 ,一切就可以正常工作,尽管User1对这些表没有显式权限。
我将Proc1从表修改为SELECT,在Database2中将其称为Table1 。 现在,当我执行Proc1时,出现以下错误:对对象'Table1',数据库'Database2',架构'dbo'的SELECT权限被拒绝
我的理解是,当我将EXECUTE授予存储过程时,SQL Server将处理所需的权限。 当表(或对象)位于另一个数据库中时,这种方法的工作方式不同吗?
笔记:
当SQL Server检查权限链中的权限时,似乎有所不同。 特别:
可以将SQL Server配置为允许在特定数据库之间或在单个SQL Server实例内的所有数据库之间进行所有权链接。 跨数据库所有权链接默认情况下处于禁用状态,除非特别需要,否则不应启用。
(来源: http : //msdn.microsoft.com/zh-cn/library/ms188676.aspx )
晚会晚了,但是我建议您看看这种情况下的签名存储过程。 与向用户授予对多个数据库的权限或打开数据库所有权链接相比,它们安全得多。
...为了使用户可以在没有testtbl的SELECT权限的情况下运行此过程,您需要执行以下四个步骤:
1.创建证书。
2.创建与该证书关联的用户。
3.授予用户对testtbl的SELECT权限。
4.每次更改程序时,请使用证书对程序进行签名。
调用该过程时,证书用户的权限将添加到实际用户的权限中。 ...
(摘自http://www.sommarskog.se/grantperm.html#Certificates )
MSDN上也提供了更多文档。
确保两个数据库中的用户实际上是相同的。 不只是NAMED一样。 尝试从两个数据库中删除该用户,然后在SERVER用户下创建该用户,并从该单个用户帐户为每个数据库分配适当的权限。
要在2018年底使用来自Microsoft的更新文本来扩展@Szymon的答案,请执行以下操作:
默认情况下,跨数据库的所有权链接是关闭的。 Microsoft建议您禁用跨数据库所有权链接,因为它会使您面临以下安全风险:
数据库所有者和
db_ddladmin
或db_owners
数据库角色的db_ddladmin
可以创建其他用户拥有的对象。 这些对象可以潜在地针对其他数据库中的对象。 这意味着,如果启用跨数据库所有权链接,则必须使用所有数据库中的数据完全信任这些用户。具有CREATE DATABASE权限的用户可以创建新数据库并附加现有数据库。 如果启用了跨数据库所有权链接,则这些用户可以从他们创建的新创建的数据库或附加的数据库访问他们可能没有权限的其他数据库中的对象。
还提到了有关动态SQL和证书签名的过程,例如@Rozwel在其答案中提到的过程。
(来源: https : //docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.