Entendo que posso usar a EXECUTE AS OWNER
cláusula como parte de um procedimento que criei para fazer com que o corpo desse procedimento seja executado como um usuário diferente. Meu objetivo é executar um comando que requer o sysadmin
papel ( DBCC TRACEON(1224)
). Este procedimento deve ser chamado por um usuário sem privilégios.
Eu executei o seguinte script no sa
usuário:
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
A saída está embutida nos comentários. Acontece que fora do procedimento pareço ter sysadmin
adesão, mas não dentro do procedimento.
O procedimento é de propriedade do dbo
usuário. Entendo que não é possível conceder a sysadmin
função a um usuário do banco de dados (pelo menos a GUI não oferece essa possibilidade). Portanto, não vejo como poderia fazer um usuário de banco de dados ter uma função de servidor.
Eu também tentei o EXECUTE AS 'sa'
que resulta em Cannot execute as the user 'sa', because it does not exist or you do not have permission.
. A documentação afirma que só posso especificar um nome de usuário, não um nome de login. Então eu entendo porque isso não funcionou.
Como posso executar meu procedimento com sysadmin
associação de função?
Você está abrindo um buraco em sua segurança ao permitir que um usuário sem privilégios execute a função de administrador do sistema.
Se você estiver tentando definir o
1224
traceflag, que desabilita a escalação de bloqueio com base no número de bloqueios, poderá fazê-lo no nível da tabela usandoALTER TABLE
Por exemplo, Below habilita o escalonamento de bloqueio para o nível de partição em uma tabela particionada. Se a tabela não for particionada, a escalação de bloqueio será definida no nível TABLE.
ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
-- as opções válidas são AUTO, TABLE e DISABLEAgora você pode apenas dar a um usuário sem privilégios direitos de alteração de tabela.
HTH
Isso pode ser feito, mas geralmente é considerado bastante perigoso. Em um nível muito básico, você define o
trustworthy
sinalizador no banco de dados e, ao usá-loexecute as
no sp, ele pode aproveitar o acesso de segurança dos principais no nível do servidor.Devido ao quão perigoso isso é, não quero entrar em detalhes aqui. No entanto, eu escrevi sobre isso aqui com instruções específicas sobre como fazê-lo.
Tudo o que foi dito, certifique-se
NEED
de fazer absolutamente dessa maneira. Você está abrindo uma grande brecha de segurança. Se você decidir fazer isso, coloque seu SP em seu próprio banco de dados e apenas conceda aos usuários conectar e executar acesso ao sp.Criar um trabalho do SQL Server Agent (de propriedade de um membro do administrador do sistema) resolverá o problema, embora eu perceba que essa não é uma solução muito bonita.
O usuário pode iniciar o trabalho (de forma assíncrona) usando msdb.dbo.sp_start_job. A execução de um trabalho do Agente de forma síncrona, no entanto, requer mais algumas linhas de código se for um requisito. Além disso, obviamente, você precisa ter o serviço SQL Server Agent instalado e funcionando.