SQL SERVER在存储过程内部更改安全上下文

时间:2011-09-13 10:54:57

标签: sql-server sql-server-2005 sql-server-2008 stored-procedures

在一些存储过程中,我必须将安全上下文更改为更强大的登录。 我试过这样的事情:

USE ProjectsDB
EXECUTE AS login = 'sa'

--SOME OPERATIONS

REVERT;

但是我收到以下错误消息:

Msg 15406, Level 16, State 1, Line 3
Cannot execute as the server principal because the principal "sa" does not exist,
this type of principal cannot be impersonated, or you do not have permission.

'sa'登录存在所有必需的权限。 可能是什么问题?

伊兰。

1 个答案:

答案 0 :(得分:3)

您需要拥有“IMPERSONATE”权限才能执行此操作。查看GRANT IMPERSONATE声明。

除此之外,我认为在sql server中执行此操作的最佳方法(而不是将权限级别提升到SA)是:

  • 创建证书
  • 使用证书
  • 对存储过程进行签名
  • 从证书中删除私钥
  • 从证书
  • 创建用户
  • 向用户授予所需权利

如果您需要“服务器范围权限”,则可选:

  • 将证书导出到磁盘
  • 在master数据库中导入证书
  • 从证书创建登录
  • 授予登录的相应权利

如果您需要“跨数据库权限”,则需要更多选项

  • 在要授予权限的数据库中导入证书
  • 从证书创建用户。
  • 向用户授予正确的权利

SQL Server将通过证书将所有用户/登录权限链接在一起,当您执行签名过程时,它将使用链接到证书的用户的权限。