非常感谢您的代码!我编辑了触发器,使其监视整个数据库中的所有表,而不仅仅是特定的“= object_id('dbo.guineapigtbl')”表。
ALTER trigger trig_db_alter_table on database
for ALTER_TABLE
as
begin
declare @d xml = EVENTDATA();
declare @tblschemaname sysname,
@tblname sysname,
@action varchar(20),
@colname sysname,
@sqlcommand nvarchar(max),
@WHILE_Count int,
@WHILE_Count_Max int;
select
@tblschemaname = @d.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname'),
@tblname = @d.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'),
@action = @d.value('local-name((/EVENT_INSTANCE/AlterTableActionList/*)[1])', 'varchar(20)'),
@colname = @d.value('(/EVENT_INSTANCE/AlterTableActionList/*[1]/Columns/Name)[1]', 'sysname'),
@sqlcommand = @d.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)');
CREATE TABLE #TMP_list_of_tables_in_DB
(ID INT IDENTITY(1,1)
,object_id_table int
)
INSERT INTO #TMP_list_of_tables_in_DB
(object_id_table)
SELECT
(object_id)
FROM [DBNAME].sys.objects
WHERE TYPE IN('P','T','FN','u')
AND TYPE_DESC = 'USER_TABLE'
SET @WHILE_Count = 1
SET @WHILE_Count_Max = (SELECT MAX(ID) FROM #TMP_list_of_tables_in_DB)
WHILE @WHILE_Count <= @WHILE_Count_Max
BEGIN
if object_id(quotename(@tblschemaname) + '.' + quotename(@tblname)) = (SELECT object_id_table FROM #TMP_list_of_tables_in_DB WHERE ID = @WHILE_Count)
and @colname is not null
begin
insert into dbo.logtablechanges
(
tableobject_id,
tablename, columnname, theaction, thestatement
)
values
(
object_id(quotename(@tblschemaname) + '.' + quotename(@tblname)),
@tblname, @colname, @action, @sqlcommand
)
end
SET @WHILE_Count = @WHILE_Count + 1
END
DROP TABLE #TMP_list_of_tables_in_DB
end