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

Jer*_*emy 6 sql-server stored-procedures sql-server-2008-r2

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

消息229,级别14,状态5,过程teststoredprocedure,第7行对象'testtable',数据库'testdatabase',schema'testschema'上的SELECT权限被拒绝.

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

Ben*_*Ben 2

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

通常,模式由与模式同名的角色拥有,因此要允许storedprocschema.teststoredprocedure访问表,将是:

GRANT SELECT on testschema.testtable TO storedprocschema WITH GRANT
Run Code Online (Sandbox Code Playgroud)

当且仅当表与过程位于同一数据库中时,这才应该起作用。

要使用不同数据库中的表获得相同的结果,您可以:

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

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