SQL Server 允许存储过程链接

Ska*_*ary 5 sql-server stored-procedures permissions

我必须承认我不是 DBA,但我需要维护一个 SQL Server 实例,并且存储过程权限链几乎没有问题(希望条款是正确的)。

为了简要解释我的需求,我有一个用户应该只在一个数据库上授予权限,该数据库应该运行一个存储过程(在该“授予”数据库上),该存储过程包含对外部数据库的引用(我应该继承一些授予)

详细来说,我的情况是我有三个数据库

  1. 配置数据库(每个人都应该读取,但除了配置用户之外,任何人都不能写入)
  2. 登台数据库(应由登台过程读取/写入)
  3. 最终数据库(应由应用程序读取/写入)

所以我有三个用户

  1. 配置用户:用于维护配置DB中的数据
  2. 临时用户:由许多将数据放入临时数据库的临时过程(非常长的过程,可能需要几个小时)使用
  3. 最终用户:由在登台过程完成时读取数据的应用程序使用,以在登台数据库中部署数据并将其放回最终数据库。最终用户可以访问每个数据库(至少可以读取)

到目前为止一切顺利,暂存过程完成其工作,并在完成后写入信号量(通知数据已准备好)。有时,应用程序(使用最终用户)会检查信号量并将所有数据提取到最终数据库中。

现在我必须支持快速、按需的暂存过程(由于其他原因我仍然需要从暂存数据库执行),该过程完成后,应直接将数据更新到最终数据库中。

我已经编写了这样的过程,一切都按预期工作,但我必须将 FinalDB 上的读/写操作授予暂存用户,我不喜欢它。有许多应用程序使用临时用户,其中一些应用程序不在“我的控制之下”,因此我不希望将数据写入临时数据库的错误应用程序最终会弄乱最终数据库。我可以接受我的新的按需暂存过程可能很关键(并且最终会弄乱最终数据库)。

所以问题是,暂存用户已被授予执行存储过程(EG:OnDemandUpdate)的权限,因为它是暂存数据库的一部分,但包含对外部表(来自最终数据库)的插入/更新,并且我希望该授权可以是被束缚。我怎样才能做到这一点?

J.D*_*.D. 4

我认为您正在寻找的是跨数据库所有权链接

跨数据库所有权链接是所有权链接的扩展,只不过它确实跨越了数据库边界。

请参阅Microsoft 的联机丛书以获取更多信息。可以仅为单个数据库打开它,这可能对您的用例更有意义:

您可以使用 ALTER DATABASE 语句的 SET 子句为各个数据库设置跨数据库所有权链接。如果要创建新数据库,可以使用 CREATE DATABASE 语句为新数据库设置跨数据库所有权链接选项。


或者,另一种解决方案是使用该EXECUTE AS语句来模拟有权访问数据库中的表的登录名Final

您可以将其放入用户有权执行的过程中Staging,然后只有该过程有权修改数据库中的表Final

使用此解决方案,Staging用户将需要访问权限才能模拟正在使用的登录名。Final这比直接向用户授予访问权限要好,Staging因为您通过存储过程控制数据库,并且理想情况下,它将模拟的登录名在数据库中仅具有有限的访问权限(仅需要更新的单个表?)Final

  • 另一种替代方法是使用基于具有所需数据库访问和权限的用户的证书对存储过程进行签名。 (3认同)