我必须假设我不是 DBA,但我需要维护一个 SQL Server 实例,并且存储过程权限链接几乎没有问题(希望条款是正确的)。
为了简要解释我的需求,我有一个用户应该只在一个应该运行包含对外部数据库的引用的存储过程(在那个“授予”数据库上)的数据库上授予权限(我应该继承一些授权)
详细地说,我的情况是我有三个数据库
- 配置数据库(每个人都应该阅读,但除了配置用户之外,任何人都不能写)
- 暂存数据库(应由暂存过程读取/写入)
- 最终数据库(应由应用程序读取/写入)
所以我有三个用户
- 配置用户:用于维护配置数据库中的数据
- Staging User :由许多将数据放入 Staging DB 的 staging 过程(非常长的过程,可能需要数小时)使用
- 最终用户:由在登台过程完成时读取数据的应用程序用于在登台数据库中部署数据并将其放回最终数据库。最终用户可以访问每个数据库(至少用于阅读)
到目前为止一切顺利,登台程序完成他们的工作,并在完成时编写一个信号量(通知数据准备好)。有时应用程序(使用最终用户)检查信号量并将所有数据摄取到最终数据库中。
现在我必须支持一个快速、按需的暂存过程(由于其他原因,我仍然需要从暂存数据库执行),完成后,应该直接将数据更新到最终数据库。
我已经编写了这样的程序并且一切都按预期工作,但是我必须将 FinalDB 上的读/写操作授予临时用户,我不喜欢它。有许多使用 Staging User 的应用程序,其中一些不是“在我的控制之下”,所以我不认为应该将数据写入 Staging DB 的错误应用程序最终会弄乱 Final DB。我可以接受我的新的按需登台过程可能很关键(最终会弄乱最终数据库)。
所以问题是,Staging User 已经被授予执行存储过程(例如:OnDemandUpdate),因为它是 Staging DB 的一部分,但包含对外部表(来自 Final DB)的插入/更新,我希望授予可以是链式的。我怎样才能做到这一点?
我认为您正在寻找的是跨数据库所有权链接:
有关详细信息,请参阅Microsoft 的联机丛书。可以只为单个数据库打开它,这可能对您的用例更有意义:
或者,另一种解决方案可能是使用该
EXECUTE AS
语句来模拟有权访问Final
数据库中的表的登录。您可以将它放在
Staging
用户有权执行的过程中,然后只有该过程有权修改Final
数据库中的表。使用此解决方案,
Staging
用户将需要访问权限才能模拟正在使用的登录名。这比直接授予用户Final
访问权限要好,Staging
因为您通过存储过程控制数据库,理想情况下,它将模拟的登录在数据库中只有有限的访问权限(只是您需要更新的单个表?)Final
。