Usuário com melhor resposta
Trigger de Database

Pergunta
-
Respostas
-
Tráfego,
Sim o Trigger de DDL é justamente uma possível solução para se trabalhar com Trigger para Eventos de Bancos de Dados, mas alguns cuidados devem ser tomados para evitarmos impactos no acesso aos bancos de dados.
Veja abaixo um exemplo:
USE DBSUPSQL; GO ----==================================================================== --- ESCOPO DE CRIACAO DE TABELA , PK , INDICE ( NONCLUSTERED) ----==================================================================== If Object_Id ('Auditoria_Logon') Is Not Null Drop Table Auditoria_Logon ; Go Create Table dbo.Auditoria_Logon ( id_Auditoria_Logon Int Identity (1,1), [Login] Varchar(100) , Data_Login SmallDatetime , Usuario Varchar(100) , Aplicacao Varchar(100) , [Host] Varchar(100) , [DataBase] Varchar(100) , Evento Varchar(Max)) Go Alter Table Auditoria_Logon Add Constraint Pk_Auditoria_Logon Primary Key (id_Auditoria_Logon) Go Create NonClustered Index ID_01 On Auditoria_Logon ([Login], Data_Login ) With FillFactor = 80 Go ----==================================================================== --- TRIGGER DE LOGON ----==================================================================== If Object_Id ('trg_Auditoria_LOgin') Is Not Null Drop trg_Auditoria_LOgin ; Go CREATE TRIGGER trg_Auditoria_LOgin ON ALL SERVER FOR LOGON -- With Execute as 'sa' AS BEGIN Insert Into Auditoria_Logon ( Login,Data_Login,Usuario,Aplicacao,[Host],[DataBase],Evento ) Select Login = ORIGINAL_LOGIN() , Data_Login = Getdate() , Usuario = USER_NAME() , Aplicacao = APP_NAME() , Host = HOST_NAME() , [DataBase] = DB_NAME() , Evento = Convert(Varchar(max),EVENTDATA()) ----======================================================================== --- ESSE FILTRO DEPENDE DA NOSSA NECESSIDADE LOGAR UMA VEZ AO DIA OU LOGAR --- TODA VEZ QUE ABRIR UMA SESSAO COM SQL SERVER ? ----======================================================================= Where Not Exists ( Select * From Auditoria_Logon aa Where Usuario = USER_NAME() And Convert(Varchar(10), Data_Login ,113) = Convert(Varchar(10), Getdate() ,113)) END;
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
- Marcado como Resposta Giovani Cr segunda-feira, 2 de dezembro de 2013 12:32
Todas as Respostas
-
-
-
Douglas,
Na verdade você esta se referindo a Triggers do tipo DML, o SQL Server também trabalhar com Triggers no Nível de Banco de Dados, mas a forma de uso é outra.
Veja se estes exemplos podem te ajudar:
Create Table NovosProdutos (Codigo Int Identity(1,1), Descricao VarChar(20), Saldo Int) Go Insert Into NovosProdutos Values('Produto -'+Convert(VarChar(3),@@Identity),0) Go 100 Create Table Movimentacao (Codigo Int Identity(1,1), CodProduto Int, TipoMovimentacao Char(1), Valor Int) Go Create Trigger T_MovimentacaoSaldo On Movimentacao After Insert, Update As Declare @TipoMovimentacao Char(1) Select @TipoMovimentacao=TipoMovimentacao from Inserted If @TipoMovimentacao = 'E' Begin Update NovosProdutos Set Saldo = Saldo + I.Valor from NovosProdutos NP Inner Join Inserted I On NP.Codigo = I.CodProduto End If @TipoMovimentacao = 'S' Begin Update NovosProdutos Set Saldo = Saldo - I.Valor from NovosProdutos NP Inner Join Inserted I On NP.Codigo = I.CodProduto End --Fazendo lançamentos de entrada Insert Into Movimentacao Values(2,'E',10) Insert Into Movimentacao Values(2,'E',15) Insert Into Movimentacao Values(2,'E',5) Insert Into Movimentacao Values(2,'E',22) Insert Into Movimentacao Values(2,'E',10) --Fazendo lançamentos de saída Insert Into Movimentacao Values(2,'S',8) Insert Into Movimentacao Values(2,'S',5) Insert Into Movimentacao Values(2,'S',3) Insert Into Movimentacao Values(2,'S',2) Insert Into Movimentacao Values(2,'S',1) Insert Into Movimentacao Values(8,'E',10) Insert Into Movimentacao Values(9,'E',15) Insert Into Movimentacao Values(1,'E',5) Insert Into Movimentacao Values(3,'E',22) Insert Into Movimentacao Values(22,'E',10) --Fazendo lançamentos de saída Insert Into Movimentacao Values(8,'S',8) Insert Into Movimentacao Values(9,'S',5) Insert Into Movimentacao Values(1,'S',3) Insert Into Movimentacao Values(3,'S',2) Insert Into Movimentacao Values(22,'S',1) Select * from NovosProdutos
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
-
Olá caros.
Acabei encontrando. é chamado trigger de DLL. Veja: http://technet.microsoft.com/en-us/library/ms190989(v=sql.105).aspx
-
Tráfego,
Sim o Trigger de DDL é justamente uma possível solução para se trabalhar com Trigger para Eventos de Bancos de Dados, mas alguns cuidados devem ser tomados para evitarmos impactos no acesso aos bancos de dados.
Veja abaixo um exemplo:
USE DBSUPSQL; GO ----==================================================================== --- ESCOPO DE CRIACAO DE TABELA , PK , INDICE ( NONCLUSTERED) ----==================================================================== If Object_Id ('Auditoria_Logon') Is Not Null Drop Table Auditoria_Logon ; Go Create Table dbo.Auditoria_Logon ( id_Auditoria_Logon Int Identity (1,1), [Login] Varchar(100) , Data_Login SmallDatetime , Usuario Varchar(100) , Aplicacao Varchar(100) , [Host] Varchar(100) , [DataBase] Varchar(100) , Evento Varchar(Max)) Go Alter Table Auditoria_Logon Add Constraint Pk_Auditoria_Logon Primary Key (id_Auditoria_Logon) Go Create NonClustered Index ID_01 On Auditoria_Logon ([Login], Data_Login ) With FillFactor = 80 Go ----==================================================================== --- TRIGGER DE LOGON ----==================================================================== If Object_Id ('trg_Auditoria_LOgin') Is Not Null Drop trg_Auditoria_LOgin ; Go CREATE TRIGGER trg_Auditoria_LOgin ON ALL SERVER FOR LOGON -- With Execute as 'sa' AS BEGIN Insert Into Auditoria_Logon ( Login,Data_Login,Usuario,Aplicacao,[Host],[DataBase],Evento ) Select Login = ORIGINAL_LOGIN() , Data_Login = Getdate() , Usuario = USER_NAME() , Aplicacao = APP_NAME() , Host = HOST_NAME() , [DataBase] = DB_NAME() , Evento = Convert(Varchar(max),EVENTDATA()) ----======================================================================== --- ESSE FILTRO DEPENDE DA NOSSA NECESSIDADE LOGAR UMA VEZ AO DIA OU LOGAR --- TODA VEZ QUE ABRIR UMA SESSAO COM SQL SERVER ? ----======================================================================= Where Not Exists ( Select * From Auditoria_Logon aa Where Usuario = USER_NAME() And Convert(Varchar(10), Data_Login ,113) = Convert(Varchar(10), Getdate() ,113)) END;
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
- Marcado como Resposta Giovani Cr segunda-feira, 2 de dezembro de 2013 12:32
-
-
Olá Rodrigo,
Voce pode criar uma trigger para ser disparada antes do comando sofrer o commit e fazer com que a trigger the roll back na situação que você não quer que aconteça. Algo do tipo:
create trigger dbo.something after insert as begin if exists ( select * from inserted where sum(credits) > 30 ) begin rollback transaction raiserror ('some message', 16, 1) end end
Espero ter ajudado. Caso sim classifique a resposta como útil por favor.
Justo Daniel
MCTS/MCDST/MCP
-
-
M. Rodrigo,
Exatamento o que você precisa fazer quando uma nova base é attachada? Dependendo do que for o que poderia te ajudar seria o Policy Management de uma olhada e veja se lhe ajuda:
http://technet.microsoft.com/en-us/library/bb510667(v=sql.105).aspx
att,
Justo Daniel
MCTS/MCDST/MCP
-
Olá, No books online você encontra todos os eventos monitorados pelas Triggers de DDL. Procure no tópico DDL Triggers, subtópico event groups. Veja se o exemplo abaixo ajuda você.
create TRIGGER [ddltrg_CREATE_DATABASE] ON ALL SERVER FOR CREATE_DATABASE AS rollback PRINT 'Database Não pode Ser Criada neste momento. Procure o departamento de TI.' GO ENABLE TRIGGER [ddltrg_CREATE_DATABASE] ON ALL SERVER GO
Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008
-
Olá Roberto.
Já usei diversos eventos, inclusive um grupo de evento também de nível de servidor "DDL_SERVER_LEVEL_EVENTS" a Trigger é disparada e mensagem aparece porem ele anexa o database. O objetivo é que a trigger impeça que o database seja Anexado(attach).
executei sua trigger e o resultado foi:
------------------------------
ADDITIONAL INFORMATION:
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
------------------------------
A transação foi encerrada no gatilho. O lote foi anulado.
Database Não pode Ser Criada neste momento. Procure o departamento de TI. (Microsoft SQL Server, Error: 3609)
------------------------------
BUTTONS:
OK
------------------------------
Porem o Database foi Anexado.
Caso tenha alguma outra ideia, será bem vinda.
Obrigado!