【问题标题】:How to get SQL Server schema changes especially "column name" changes如何获取 SQL Server 架构更改,尤其是“列名”更改
【发布时间】:2010-10-22 12:54:37
【问题描述】:

我正在使用触发器来跟踪 DDL 更改,但是当我从 SQL Server Management Studio 更改列名时,触发器不起作用?

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)
--)

【问题讨论】:

  • 如果您是从对象资源管理器而不是脚本更改数据库结构,请立即停止。如果没有源代码管理中的脚本,则不应更改数据库。
  • 我只想跟踪这些更改以确保安全。

标签: sql sql-server tsql sql-server-2005 ddl-trigger


【解决方案1】:

您不会收到专门针对列更改的事件。相反,您将收到一个 ALTER_TABLE 事件,表明该表已更改。

当您说 SQL Server 控制台时,您是指 Management Studio 吗?如果是这样,请查看它生成的 SQL 以更改您的表。它可能正在创建一个新表,将数据复制到其中,删除旧表并重命名新表,因此您将看到许多事件,例如CREATE_TABLE,然后是DROP_TABLE

【讨论】:

  • 是的,我的意思是管理工作室。触发器正在为所有 DLL 事件运行,不是吗?:FOR DDL_DATABASE_LEVEL_EVENTS。我还尝试了 CREATE_TABLE、ALTER_TABLE、DROP_TABLE、事件,但没有奏效。
  • 你的触发器被调用了吗?是否有其他问题阻止将行插入 db_trc_DDLChangeLog?此外,如果管理工作室生成的 SQL 使用 sp_rename,它不会导致在 SQL Server 2005 中引发 DDL 事件。
  • db_trc_DDLChangeLog 没有问题,因为当我删除表时它写入日志我认为 sp_rename 没有触发 DDL 事件..
  • 是的 - sp_rename 在 SQL 2008 中已修复,但在 2005 年不会引发事件。
猜你喜欢
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多