Eu preciso realizar alguma auditoria, quando mudar de propriedade segura, como
ALTER AUTHORIZATION ON SCHEMA::[SchemaName] TO [PrincipalName];
acontece no banco de dados.
O gatilho DDL do escopo do banco de dados parece ser um mecanismo apropriado para essa finalidade. Na documentação (seção DDL Statements That Have Server or Database Scope ) vejo que deve haver ALTER_AUTHORIZATION
event.
No entanto, quando estou tentando criar um DDL-trigger apropriado
CREATE TRIGGER [OnAlterAuthorization] ON DATABASE
FOR ALTER_AUTHORIZATION
AS
BEGIN
PRINT 'Perform audit';
END
Estou recebendo erro Msg 1084
Msg 1084, Level 15, State 1, Procedure OnAlterAuthorization, Line 2 [Batch Start Line 0] 'ALTER_AUTHORIZATION' é um tipo de evento inválido.
Dentrosys.event_notification_event_types
SELECT type_name
FROM sys.event_notification_event_types
WHERE type_name LIKE 'ALTER_AUTHOR%';
não há nenhum ALTER_AUTHORIZATION
evento, apenas
type_name
-----------------------------
ALTER_AUTHORIZATION_SERVER
ALTER_AUTHORIZATION_DATABASE
deles ALTER_AUTHORIZATION_SERVER
não atende obviamente, e ALTER_AUTHORIZATION_DATABASE
de acordo com a documentação
Aplica-se à instrução ALTER AUTHORIZATION quando ON DATABASE é especificado
Então, a questão é. Onde está ALTER_AUTHORIZATION
prometido na documentação? Como posso pegar a mudança de uma propriedade segura no banco de dados?
Me deparei com o mesmo problema que você. Eu continuaria descobrindo que as Notificações de Eventos podem ser usadas para lidar com o
AUDIT_CHANGE_DATABASE_OWNER
evento. (Observe que esse evento não pode ser usado com um gatilho DDL.) Eu escrevi um artigo de blog Event Notifications que por acaso usa oAUDIT_CHANGE_DATABASE_OWNER
evento como exemplo: SQL Server Event Handling: Event NotificationsAbaixo está um script que pode ajudá-lo a começar.
Descobri que apesar desse evento
ALTER_AUTHORIZATION_DATABASE
de acordo com a documentação ser declarado comoele é acionado não apenas quando o proprietário do banco de dados é alterado, mas também quando o proprietário de uma alteração protegível no banco de dados.
Em outras palavras, o gatilho DDL
funciona não só para
Mas por exemplo para
ou
também.