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

Posted

技术标签:

【中文标题】作为另一个用户权限执行存储过程【英文标题】:Execute a stored procedure as another user permission 【发布时间】:2011-02-18 15:33:00 【问题描述】:

我遇到了以下问题:有一个用户必须执行存储过程 (spTest)。在 spTest 的主体中调用 sp_trace_generateevent。 sp_trace_generateevent 需要更改跟踪权限,我不希望用户拥有它。所以我希望用户能够执行 spTest。我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

试试这个:

EXECUTE AS user = 'special_user'

EXECUTE YourProcerdure

REVERT

查看这些:Understanding Context Switching<<<has examples of things like you are trying to doUnderstanding Execution ContextEXECUTE AS Clause (Transact-SQL)EXECUTE AS (Transact-SQL)

【讨论】:

由于某种原因它没有帮助。我收到错误提示我无权运行 sp_trace_generateevent。但是当我以 special_user 身份连接到服务器时,执行 sp_trace_generateevent 没有问题。有什么想法吗? 来自:msdn.microsoft.com/en-us/library/ms181362.aspx EXECUTE AS 中指定的用户或登录名必须分别作为 sys.database_principals 或 sys.server_principals 中的主体存在,否则 EXECUTE AS 语句将失败。此外,必须在主体上授予 IMPERSONATE 权限。除非调用者是数据库所有者,或者是 sysadmin 固定服务器角色的成员,否则即使用户通过 Windows 组成员身份访问数据库或 SQL Server 实例,主体也必须存在。 这个建议也无济于事。看来我应该打开 TRUSTWORTHY。还是谢谢你。【参考方案2】:

正如其他人所建议的,您可以使用 Execute As 子句来实现您想要的。有关实现选择的示例,请查看在线图书文档中的 Execute As 子句。

为了进一步阅读并加深对本主题的理解,您希望实现的目标属于 Context Switching 的安全概念。

【讨论】:

【参考方案3】:

这就是我所做的(并且成功了):

let Source = Sql.Database("server", "database", 
    [Query= "EXECUTE AS USER='user' EXECUTE [schema].[spname] 'parm1', 'parm2'"])

Source

【讨论】:

【参考方案4】:

当您执行该特定存储过程时,您将需要使用所需的用户凭据创建不同的连接。

【讨论】:

由于某种原因它没有帮助。我收到错误提示我无权运行 sp_trace_generateevent。但是当我以 special_user 身份连接到服务器时,执行 sp_trace_generateevent 没有问题。有什么想法吗?

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

存储过程权限和执行

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

执行包含删除查询的存储过程的用户是不是需要删除权限?

使用对存储过程具有执行权限的 SQL 用户插入 SQL 动态查询

授予用户对数据库中所有存储过程的执行权限?

Snowflake /当存储过程作为OWNER执行时如何获取原始调用者