作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开发了一个存储过程,以便从备份文件中恢复数据库并向其中添加应用程序用户。此存储过程属于 master 数据库。
问题是我的 IT 部门不允许我使用 admin 用户,只能对 sysadmin 用户使用 EXECUTE AS 语句。
我可以恢复数据库,但我找不到在进程结束时添加用户的方法。
我使用的代码:
CREATE PROCEDURE [dbo].[myProc]
@database VARCHAR(50)
WITH EXECUTE AS 'aSysAdminUser'
AS
BEGIN
--Restore the database (working)
--Add the application user (not working)
SET @sqlScript = 'USE '+@database +';
CREATE USER [myApplicationUser] FROM LOGIN [myApplicationUser];
EXEC sp_addrolemember ''db_owner'', ''myApplicationUser'''
EXEC(@sqlScript)
END
The server principal "aSysAdminUser" is not able to access the database "database" under the current security context.
最佳答案
您面临的问题是模拟的限制(即通过 EXECUTE AS
切换安全上下文)。对于数据库范围的对象,例如存储过程,您正在指定数据库级别 user
在 EXECUTE AS
子句,不是服务器级别的 login
.因此,此过程实际上并没有充当 sysadmin
.但是,有一种方法可以安全地将这个存储过程授予 true sysadmin
允许它执行动态 SQL 中的步骤的权限,即:
sysadmin
服务器角色。然后,当任何用户/登录名(对该存储过程具有
EXECUTE
权限)执行此过程时,它将仅通过由同一证书签名来获取基于证书的登录名的权限。
[master]
中设置证书数据库:
USE [master];
GO
CREATE CERTIFICATE [BackupRestoreCert]
ENCRYPTION BY PASSWORD = N'MyPassword'
WITH SUBJECT = N'Certificate for Managing Backup/Restore Operation Permissions';
GO
sysadmin
角色:
CREATE LOGIN [BackupRestoreOps] FROM CERTIFICATE [BackupRestoreCert];
ALTER SERVER ROLE [sysadmin] ADD MEMBER [BackupRestoreOps];
ADD SIGNATURE
TO [dbo].[myProc]
BY CERTIFICATE [BackupRestoreCert]
WITH PASSWORD = 'MyPassword';
[master]
的上下文中完成的。数据库,尽管将其分解似乎更易于解释。但是,在实践中,这将是 IT 人员运行一次的单个脚本。当然,如果你曾经
ALTER
该存储过程,他们将不得不运行
ADD SIGNATURE
再次命令(即第 3 步),因为它会在过程定义发生任何更改时丢失。
sysadmin
,它就做到了。角色,创建用户并将其添加到
db_owner
角色。
EXECUTE AS
存储过程中的子句。如果它确实传递了任何允许初始还原操作工作的权限,那么现在应该通过基于证书的登录来假定这些权限,因为它被标记为
sysadmin
.
EXECUTE AS
的初衷的结果。授予条款
sysadmin
此存储过程的权限。我现在只是指出,上述步骤实际上将使他们的预期行为成为现实。如果动态 SQL 上方的步骤在传入数据库名称以外的任何内容时会出错,那很好,但是对于可能希望复制此内容并只是复制/粘贴而不了解完整内容的其他人,仍然需要说明这一点语境。
sysname
(NVARCHAR(128)
的别名)因为这就是 [name]
在 [sys].[databases]
中定义. IF (DB_NAME(@database) IS NULL)
BEGIN
RAISERROR(N'Invalid Database Name', 16, 1);
RETURN;
END;
sysadmin
。希望不要使用这样的特权角色。我试过
dbcreator
,
securityadmin
,
serveradmin
, 和
setupadmin
,但不幸的是他们都没有工作:(。
关于sql-server - SQL 服务器 : EXECUTE AS clause of stored procedure not granting sysadmin permissions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26599324/
我是一名优秀的程序员,十分优秀!