Sql server 2005 我可以将SP中的执行上下文从所有者更改为调用者吗?[SQL Server 2005]

Sql server 2005 我可以将SP中的执行上下文从所有者更改为调用者吗?[SQL Server 2005],sql-server-2005,impersonation,Sql Server 2005,Impersonation,是否可以将存储过程中的执行上下文更改为调用方,该存储过程是使用执行为所有者创建的?下面是我用一个简化的例子所指的意思: 服务器实例中有多个登录名和数据库。假设每个人在自己的数据库中都有一个名为current_work的表,但没有人可以访问其他人的表。即使是老板也不允许访问员工的数据库,除非雇主决定他的表格已经准备好让老板查看。当雇主认为他的工作已经完成时,他应该将其表内容提交给老板的数据库。但是,老板不想让他的雇主在他的表中插入任何内容,因为他想实现一种业务逻辑(比如说,他想将提交记录在某个地方

是否可以将存储过程中的执行上下文更改为调用方,该存储过程是使用执行为所有者创建的?下面是我用一个简化的例子所指的意思:

服务器实例中有多个登录名和数据库。假设每个人在自己的数据库中都有一个名为current_work的表,但没有人可以访问其他人的表。即使是老板也不允许访问员工的数据库,除非雇主决定他的表格已经准备好让老板查看。当雇主认为他的工作已经完成时,他应该将其表内容提交给老板的数据库。但是,老板不想让他的雇主在他的表中插入任何内容,因为他想实现一种业务逻辑(比如说,他想将提交记录在某个地方)。因此,他希望这只能在他的控制下发生,即在他编写的SP内。他编写了一个如下所示的SP,在数据库中为每个登录名(每个员工)创建用户,然后将此SP的执行授权给他的所有雇主。员工完成后,只需调用此SP,一切都应该正常:

CREATE PROCEDURE boss.dbo.commit_work
WITH EXECUTE AS OWNER AS
BEGIN
   EXECUTE AS CALLER  -- It should be OK, since this is the default way of calling an SP anyway, thinks the boss
   SELECT * INTO ##tmptable FROM current_work  -- No prefix should mean default DB/Schema of the caller, thinks the boss
   REVERT  -- Back to OWNER's context, which happens to be the boss

   INSERT INTO boss.allwork
   SELECT * FROM ##tmptable
END
然而,事情并不像他预期的那样发展。雇主可以执行SP,但他们会收到一条错误消息:“服务器主体“Boss”无法在当前安全上下文下访问数据库“Boss”,这使Boss非常不安(顺便说一句,Boss是Boss的登录名。)

你知道哪里出了问题吗?或者您是否看到了实现这种场景的另一种方法,即除非在SP中执行,否则任何人都不应该访问其他人的数据库?当我有选择的时候,我会在应用程序级做这样的事情,但由于我们当前环境的要求,我必须在数据库级做。谢谢

我在Erlang Sommarskog的这篇伟大文章“通过存储过程授予权限”中找到了答案。我建议你通读整篇文章来领会这个观点。。我所要做的就是创建一个本地代理用户并赋予其相应的权限:

CREATE USER boss_proxy WITHOUT LOGIN
GRANT INSERT ON boss.allwork TO boss_proxy 

CREATE PROCEDURE boss.dbo.commit_work
WITH EXECUTE AS boss_proxy AS
BEGIN
   EXECUTE AS CALLER  -- It IS OK, indeed
   SELECT * INTO ##tmptable FROM current_work  -- No prefix means default DB/Schema of the caller
   REVERT  -- Back to boss_proxy's context

   INSERT INTO boss.allwork
   SELECT * FROM ##tmptable
END