作为另一个登录名执行存储过程

Posted

技术标签:

【中文标题】作为另一个登录名执行存储过程【英文标题】:Execute stored procedure as another login 【发布时间】:2013-10-08 08:40:47 【问题描述】:

我们的产品中正在运行一些 SQL 代理作业。但是我们想取消 SQL server 代理,以便我们可以使用 Sql server express。所以我正在编写我们自己的服务来执行当前作为作业运行的存储过程。除了“所有者”之外的所有其他内容都可以轻松复制。据我了解,当您在 SQL Server 代理中指定所有者时,作业会在该登录上下文中运行。我正在使用 .NET 中的 SqlCommand 类来运行存储过程。但是该类不支持提供不同的登录上下文。有没有其他方法可以让我为作业指定不同的登录名,就像 SQL Server 代理允许你做的那样?

提前致谢, -尼尔。

【问题讨论】:

【参考方案1】:

如果您不想使用当前连接从代码运行存储过程,则首先在 sql server 中创建一个用户并使用该用户执行存储过程。

SQlCommand 将连接作为保存所有者信息的参数。您将必须显式创建与新用户的新连接并使用它来执行您的 SP。

【讨论】:

【参考方案2】:

您可以在存储过程中使用EXECUTE AS 命令以作为参数传递的不同用户执行:

create procedure testing
    (@username nvarchar(100))
as
    execute as user = @username;

    select USER_NAME(); -- this is just to test the current user name, remove it later
    -- your code goes here

    revert;

您可以在此处阅读有关它和所需权限的更多信息:http://msdn.microsoft.com/en-us/library/ms181362.aspx

【讨论】:

这不是我想要的。就像 sql server 代理一样,我应该能够指定登录,而不必为该登录提供密码。我在***.com/questions/1902084/… 中看到了声明。这行得通吗? 我无法编辑存储过程(其中有多个,用户可以随时更改所有者)。相反,我将其作为查询Execute As login='sa' DECLARE @user varchar(128) DECLARE @RC int EXECUTE @RC = [QDB].[dbo].[LoginTest] @user OUTPUT select @user 执行。那行得通,但我想知道是否还有其他更优雅的解决方案。

以上是关于作为另一个登录名执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

作为另一个用户权限执行存储过程

如何使用多个输出参数执行存储过程?

使用1个存储过程中的表,该表仅在一周中的一天运行,作为对每天运行的另一个存储过程的引用

从另一个存储过程调用的存储过程中获取第一个结果集

存储过程执行另一个存储过程

oracle 存储过程中多线程执行另一个存储过程