Eu tenho um procedimento armazenado que consulta a exibição sys.dm_exec_requests . No procedimento armazenado, a exibição retorna apenas uma linha, enquanto o procedimento armazenado precisa ver todos eles. O artigo do MSDN na exibição diz que o que é retornado depende da permissão do usuário:
Se o usuário tiver permissão VIEW SERVER STATE no servidor, o usuário verá todas as sessões em execução na instância do SQL Server; caso contrário, o usuário verá apenas a sessão atual.
O procedimento armazenado é, na verdade, um procedimento armazenado de ativação de uma fila do intermediário:
CREATE QUEUE test_queue
WITH
STATUS = ON,
RETENTION = OFF ,
ACTIVATION (
STATUS = ON,
PROCEDURE_NAME = test_procedure,
MAX_QUEUE_READERS = 1,
EXECUTE AS SELF ),
POISON_MESSAGE_HANDLING (STATUS = ON)
ON [PRIMARY]
Quando li o artigo do MSDN, mudei
EXECUTE AS SELF
para
EXECUTE AS 'dbo'
o que não fez nenhuma diferença. sys.dm_exec_requests
ainda retornaria uma única linha.
Também tentei fazer
EXECUTE AS OWNER
O que também não fazia diferença. Pelo que entendi, o proprietário do procedimento armazenado é quem o criou, que fui eu. E como estou em uma função de administrador de sistema, isso deveria estar funcionando, mas não está. Agradeço qualquer dica de solução de problemas.
Em particular, gostaria de saber como listar as permissões de um servidor para um determinado usuário para que eu pudesse verificar se eles incluem a permissão 'VIEW SERVER STATE' conforme o artigo.
A parte confusa é que o usuário , pelo que entendi, está no nível do banco de dados, então não está claro para mim como ele pode ter permissão de servidor. Se você pudesse esclarecer isso, seria ótimo também.
Consulte Assinando um procedimento ativado para obter um exemplo de como assinar corretamente um procedimento ativado exatamente para que ele possa alavancar o privilégio VIEW SERVER STATE de um procedimento ativado. As etapas são:
EXECUTE AS
, mesmo se o módulo estiver assinado, o principal não terá acesso fora do banco de dados do host devido à forma como o Service Broker executa o procedimento de ativação)Na verdade, usar certificados é o caminho a seguir, como a Resposta 1 no outro tópico está mostrando ( problemas de permissão SA com muitos objetos aninhados ). No seu cenário, isso simplesmente não pode funcionar - a menos que você marque o banco de dados como CONFIÁVEL. Isso faria com que seu proc fosse executado se representado por "dbo". - No entanto, eu não sou um grande fã disso, porque abre todo o banco de dados para elevação, a menos que você realmente saiba quem está chamando o quê e possuindo o quê...