SQL Server 2008 R2:通常,我们创建表和存储过程,并授予用户对存储过程的执行权限。我们永远不必向表或 View 授予特定权限,因为如果用户可以执行存储过程,SQL Server 就会推断应该允许存储过程执行 select/insert/update 语句。效果很好,因为我们只处理一个模式,但现在我们遇到了一种情况,其中表位于一个模式中,但存储过程位于另一个模式中。当用户执行存储过程时,他们会收到错误:
Msg 229, Level 14, State 5, Procedure teststoredprocedure, Line 7 The SELECT permission was denied on the object 'testtable', database 'testdatabase', schema 'testschema'.
teststoredprocedure
与 testtable
的架构不同。是否可以允许存储过程从表中进行选择,而不授予用户对这些表的特定权限?
最佳答案
您需要向存储过程的所有者授予WITH GRANT
对该表的访问权限。
通常,架构由与架构同名的角色拥有,因此要允许 storedprocschema.teststoredprocedure
访问表,则:
GRANT SELECT on testschema.testtable TO storedprocschema WITH GRANT
当且仅当表与过程位于同一数据库中时,这才应该起作用。
要使用不同数据库中的表获得相同的结果,您可以:
启用“跨数据库所有权链接”
将该过程移动到另一个数据库,并在原始数据库中有一个调用它的填充过程。然后管理这两个过程的权限。
关于sql-server - 存储过程调用不同架构中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8511140/