Die*_*res 2 sql-server permissions t-sql sql-server-2008-r2 impersonation
在 MSSQL 2008R2 上,我在不同的服务器上有两个实例,我需要同步所有登录的密码更改。我认为我可以创建一个存储过程,其中具有 securityadmin 服务器角色的用户(模拟)更改密码。
Obs:CHANGE_PASSWORD 是具有 securityadmin 服务器角色的用户。
ALTER PROCEDURE SPU_CAMBIO_PASSWORD
(
@USER VARCHAR(50),
@PASSWORD VARCHAR(100)
)
WITH EXECUTE AS 'CHANGE_PASSWORD'
AS
DECLARE @STATEMENT VARCHAR(200)
SET @STATEMENT= 'ALTER LOGIN '+ @USER+ ' WITH PASSWORD = '''+@PASSWORD+''', CHECK_POLICY =OFF'
EXEC(@STATEMENT)
GO
Run Code Online (Sandbox Code Playgroud)
错误:无法作为服务器主体执行,因为主体“CAMBIO_PASSWORD”不存在,无法模拟此类主体,或者您没有权限。
坏消息是与语句相反的EXECUTE AS 子句(您正在使用的)仅适用于用户(数据库级别),而不适用于登录(服务器级别)。
但是,好消息是您不需要使用模拟来解决这个问题。相反,您需要使用模块签名,并通过以下步骤(全部在 中完成[master])执行此操作:
ENCRYPTION BY PASSWORD = 'password')SPU_CAMBIO_PASSWORD)EXECUTE AS如果该存储过程在签名后发生更改,则签名将自动删除,从而失去与为该基于证书的登录设置的那些特殊权限的关联。这是一件好事,因为它允许您在重新启用权限之前进行代码审查(假设您没有进行更改)。在这种情况下,您将:
ALTER CERTIFICATE删除私钥相同的命令)。