存储过程在不同的模式中调用数据

时间:2011-12-14 20:23:42

标签: sql-server stored-procedures sql-server-2008-r2

SQL Server 2008 R2:通常,我们创建表和存储过程,并授予用户对存储过程的执行权限。我们永远不必授予表或视图的特定权限,因为如果用户可以执行存储过程,则SQL Server会推断应该允许存储过程执行select / insert / update语句。运行良好,因为我们只处理一个模式,但现在我们有一个方案,其中表在一个模式中,但存储过程在另一个模式中。当用户执行存储过程时,会出现错误:

  

Msg 229,Level 14,State 5,Procedure teststoredprocedure,Line 7 The   对象'testtable',数据库上的SELECT权限被拒绝   'testdatabase',schema'testschema'。

teststoredproceduretesttable的架构不同。是否可以允许存储过程从表中进行选择,而不授予用户对这些表的特定权限?

2 个答案:

答案 0 :(得分:2)

您需要授予存储过程WITH GRANT所有者访问该表的权限。

通常,Schema由与模式同名的Role拥有,因此允许storedprocschema.teststoredprocedure访问该表:

GRANT SELECT on testschema.testtable TO storedprocschema WITH GRANT

只有当表与proc。在同一个数据库中时,这应该起作用。

要与不同数据库中的表实现相同的结果,您可以:

  • 启用“跨数据库所有权链接”

  • 将过程移动到另一个数据库,并在原始数据库中有一个调用它的shim过程。然后管理两个程序的权限。

答案 1 :(得分:0)

是的,有可能。这是你想要做的:

alter procedure teststoredprocedure
with execute as 'UserWithPermissions'
-- rest of stored proc code

UserWithPermissions对您尝试再次执行CRUD操作的数据库对象具有必要的权限。

相反,如果您的数据库用户安全上下文具有必要的权限,您也可以使用该简写来实现此目的:

with execute as self