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'。
teststoredprocedure
与testtable
的架构不同。是否可以允许存储过程从表中进行选择,而不授予用户对这些表的特定权限?
答案 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