usr*_*usr 7 security sql-server dbcc role
我的理解是,我可以将该EXECUTE AS OWNER
子句用作我创建的过程的一部分,以使该过程的主体以不同的用户身份运行。我的目标是执行需要sysadmin
角色 ( DBCC TRACEON(1224)
)的命令。此过程应该由非特权用户调用。
我在sa
用户下运行了以下脚本:
SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin')
-- dbo 1 1
IF EXISTS(SELECT * FROM sys.procedures WHERE name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
WITH EXECUTE AS OWNER
AS
SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin');
-- dbo 1 0
DBCC TRACEON(1224)
--Msg 2571, Level 14, State 3, Procedure MyProc, Line 7
--User 'dbo' does not have permission to run DBCC TRACEON.
RETURN
GO
EXEC MyProc
Run Code Online (Sandbox Code Playgroud)
输出在注释中内联。事实证明,在程序之外,我似乎拥有sysadmin
成员资格,但在程序内部却没有。
该过程归dbo
用户所有。我知道无法将sysadmin
角色授予数据库用户(至少 GUI 不提供这种可能性)。所以我不知道如何让数据库用户拥有服务器角色。
我也试过EXECUTE AS 'sa'
导致Cannot execute as the user 'sa', because it does not exist or you do not have permission.
. 该文件规定,我只能指定一个用户名,而不是一个登录名。所以我明白为什么这不起作用。
如何使用sysadmin
角色成员身份运行我的程序?
我的目标是执行一个需要 sysadmin 角色的命令 (DBCC TRACEON(1224))
通过允许非特权用户以 sysadmin 角色运行,您在安全性上打了一个洞。
如果您尝试设置1224
跟踪标志,它会根据锁的数量禁用锁升级,您可以在表级别使用ALTER TABLE
例如,下面可以将锁升级到分区表上的分区级别。如果表未分区,则在 TABLE 级别设置锁升级。
ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
-- 有效选项为 AUTO、TABLE 和 DISABLE
现在,您可以只授予非特权用户更改表权限。
HTH