2010-10-22 50 views
1

我正在使用觸發器跟蹤DDL更改,但是當我從SQL Server Management Studio更改列名稱時,觸發器無法正常工作?如何獲取SQL Server架構更改,特別是「列名稱」更改

create TRIGGER trgLogDDLEvent ON DATABASE 
    FOR DDL_DATABASE_LEVEL_EVENTS 
FOR 
AS 
DECLARE @data XML 
SET @data = EVENTDATA() 
IF @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)') 
<> 'CREATE_STATISTICS' 
INSERT INTO db_trc_DDLChangeLog 
(
EventType, 
ObjectName, 
ObjectType, 
tsql, 
RecDate, 
HostName 
) 
VALUES (
@data.value('(/EVENT_INSTANCE/EventType)[1]', 
'nvarchar(100)'), 
@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 
'nvarchar(100)'), 
@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 
'nvarchar(100)'), 
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 
'nvarchar(max)'), 
getdate(), 
HOST_NAME() 
) ; 
GO 

--select * from db_trc_DDLChangeLog 
--create table db_trc_DDLChangeLog 
--(
--EventType varchar(max), 
--ObjectName varchar(max), 
--ObjectType varchar(max), 
--tsql varchar(max), 
--RecDate datetime, 
--HostName varchar(max) 
--) 
+0

如果您要從對象資源管理器中更改數據庫結構而不是腳本,請立即停止該操作。如果沒有源代碼控制腳本,則不應更改數據庫。 – HLGEM 2010-10-22 13:17:51

+0

我只想跟蹤這個安全變化。 – MahmutHAKTAN 2010-10-22 13:28:44

回答

0

您不會專門針對列更改獲取事件。相反,您會收到ALTER_TABLE事件以指示表已更改。

當您說SQL Server控制檯是否指Management Studio?如果是這樣,看看它正在產生的SQL來改變你的表。它可能會創建一個新表格,將數據複製到它,刪除舊錶格並重命名新表格,以便您會看到一些事件,如CREATE_TABLE,然後DROP_TABLE

+0

是的,我的意思是管理工作室。觸發器正在運行所有DLL事件嗎?:對於DDL_DATABASE_LEVEL_EVENTS。我也嘗試了CREATE_TABLE,ALTER_TABLE,DROP_TABLE,事件並且沒有工作。 – MahmutHAKTAN 2010-10-22 13:22:09

+0

你的觸發器是否被調用?有沒有其他問題可以防止將行插入到db_trc_DDLChangeLog中?另外,如果management studio生成的SQL使用的是sp_rename,它不會導致在SQL Server 2005中引發DDL事件。 – 2010-10-22 13:59:39

+0

db_trc_DDLChangeLog沒有問題,因爲當我刪除表時,它會寫入日誌ı認爲sp_rename不會觸發DDL事件。 – MahmutHAKTAN 2010-10-25 13:01:03