Tenho 2 logins:
- LoginA: role dbcreator + CONECTE QUALQUER BANCO DE DADOS
- LoginB: função sysadmin
Tenho 2 bancos de dados:
- dbA: todos têm todos os direitos sobre ele
- dbB: apenas LoginB tem direitos sobre ele, LoginA é apenas o proprietário desse banco de dados, mas não mais
Gostaria de saber se é possível criar um usuário (vinculado ao LoginA) em dbB a partir de um procedimento armazenado de dbA.
Considerando que este procedimento armazenado deve ser executado por LoginA.
Talvez algum tipo de mecanismo "EXECUTE AS" possa ajudar?
Também tenho problemas sobre como usar um "USE [dbB]" em um procedimento armazenado.
A solução pode ter algumas modificações de direitos,
mas elas não podem dar funções securityadmin nem sysadmin.
Aqui está o que está feito por enquanto, mas claramente há muita depuração e funcionalidades a serem feitas, mas o espírito do que eu quero fazer está aqui:
CREATE PROCEDURE [dbB_UserAfterRestore]
AS
BEGIN
SET NOCOUNT ON;
USE [dbB]
CREATE USER [HOSTNAME\LoginA] FOR LOGIN [HOSTNAME\LoginA]
ALTER ROLE [db_datareader] ADD MEMBER [HOSTNAME\LoginA]
ALTER ROLE [db_datawriter] ADD MEMBER [HOSTNAME\LoginA]
END
GO
Como
LoginA
não é membro dasysadmin
função de servidor, o logon deve precisarIMPERSONATE
de permissões para usarEXECUTE AS
, ou seja,Uma vez
LoginA
obtido o acesso IMPERSONATE, você pode criar o procedimento da seguinte forma emdbA
ondeLoginA
obteve acesso total (db_owner)Procedimento de chamada da seguinte forma:
Se o destino for vários bancos de dados,
LoginA
deve ser membro dasysadmin
função de servidor ou deve ser usuário de todos os bancos de dados (sob função pública) e CONCEDIDO para IMPERSONATE nos respectivos bancos de dadosdb_owner