Este é o meu cenário:
- O usuário do Windows Gabe tem
db_owner
acesso ao banco de dados DB1. - O usuário do Windows Gabe tem
db_reader
no banco de dados DB2. - Quando o usuário executa
UPDATE DB2.dbo.Tbl1 SET X = 1
, ele obtém "A permissão UPDATE foi negada.." conforme o esperado. - quando o usuário executa um proc
DB1.dbo.uspUpdateTable
contendo a mesmaUPDATE
instrução acima, ele é bem-sucedido.
Eu pensei que isso poderia ser devido ao encadeamento de banco de dados ou configurações confiáveis, mas eles não estão habilitados.
Este é o comportamento esperado para db_owner
privilégio? E existe uma maneira de evitar isso?
SQL Server 2017
Abaixo estão os casos em que as atualizações serão permitidas por meio do procedimento armazenado armazenado sem que o chamador tenha permissões de atualização na tabela no outro banco de dados.
Encadeamento de propriedade
Os bancos de dados envolvidos têm a
DB_CHAINING
opção definida ou a opção 'encadeamento de propriedade entre bancos de dados' ativada no nível do servidor. No caso de objetos de propriedade do dbo, os bancos de dados também devem ter o mesmo proprietário (ou seja, o usuário do dbo mapeia para o mesmo login) para manter uma cadeia de propriedade ininterrupta.EXECUTAR COMO
O procedimento armazenado inclui uma
EXECUTE AS USER
especificação e o usuário (mapeado para o mesmo login) existe no outro banco de dados com permissões de atualização. Observe que o banco de dados deve estarTRUSTWORTHY
em ordem para que oEXECUTE AS
contexto seja respeitado por outros bancos de dados, portanto, isso não se aplica ao seu caso.Módulo de assinatura
O procedimento armazenado é assinado por um certificado e um usuário criado a partir desse certificado existe no outro banco de dados com permissões para atualizar a tabela.
Vejo pelo seu comentário que o 'encadeamento de propriedade de banco de dados cruzado' foi o culpado. Isso também implica que os bancos de dados também têm o mesmo proprietário. Sugiro que você altere o proprietário do banco de dados para bancos de dados em que os membros da função não sysadmin podem criar objetos de propriedade do dbo para mitigar o risco de segurança.