É possível rastrear as alterações DDL em um banco de dados SQL Server 2005 ou superior, através de DDL triggers. Um exemplo simples, seria:
CREATE TRIGGER seguranca
ON DATABASE
FOR CREATE_TABLE
AS
RAISERROR ('Não é possível criar novas tabelas no banco de dados.', 16, 1)
ROLLBACK
ON DATABASE
FOR CREATE_TABLE
AS
RAISERROR ('Não é possível criar novas tabelas no banco de dados.', 16, 1)
ROLLBACK
Porém podemos montar uma ambiente mais complexo, armazenando as alterações, qual usuário responsável e de onde partiram. Veja o exemplo abaixo:
--Criando a tabela DDL_LOG
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000),hostname nvarchar(100));
GO
--Criando a trigger
CREATE TRIGGER log
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT ddl_log
(PostTime, DB_User, Event, TSQL, HOSTNAME)
VALUES
(GETDATE(),
CONVERT(nvarchar(100), CURRENT_USER),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)'),
host_name()) ;
GO
--Testando a trigger
CREATE TABLE TestTable (a int)
DROP TABLE TestTable ;
GO
--Listando as alterações armazenadas em ddl_log
SELECT * FROM ddl_log ;
GO
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000),hostname nvarchar(100));
GO
--Criando a trigger
CREATE TRIGGER log
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT ddl_log
(PostTime, DB_User, Event, TSQL, HOSTNAME)
VALUES
(GETDATE(),
CONVERT(nvarchar(100), CURRENT_USER),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)'),
host_name()) ;
GO
--Testando a trigger
CREATE TABLE TestTable (a int)
DROP TABLE TestTable ;
GO
--Listando as alterações armazenadas em ddl_log
SELECT * FROM ddl_log ;
GO
Nenhum comentário:
Postar um comentário
Leave your comment here!