我有一个包含三列(姓名、年龄、城市)的表。现在,如果某个时候有人在表格中添加了一个额外的列(国家)。我如何知道哪一列已添加到表中,即国家/地区。
每当有人更改表结构时,有什么方法可以跟踪表结构的变化?
我有一个包含三列(姓名、年龄、城市)的表。现在,如果某个时候有人在表格中添加了一个额外的列(国家)。我如何知道哪一列已添加到表中,即国家/地区。
每当有人更改表结构时,有什么方法可以跟踪表结构的变化?
SQL Server DDL 触发器可用于跟踪 DDL 更改,无论更改是有意的还是意外的。谁提交了更改,何时提交以及受提交操作影响的内容是需要使用触发器捕获的基本信息。要使用此解决方案,需要创建和维护触发器和捕获的信息存储
在以下示例中,使用 SQL Server 的 EVENTDATA() 函数捕获有关触发触发器的事件的信息。SQL 脚本创建 DDL 触发器,该触发器在数据库级别捕获 CREATE、ALTER 和 DROP 事件(尽管可以在服务器级别创建触发器以捕获服务器上所有数据库的事件;应使用 ON ALL SERVER 选项,而不是在数据库上):
CREATE TRIGGER Audit_DDL
ON DATABASE
FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE
AS
DECLARE
@event xml;
SET
@event = EVENTDATA();
INSERT INTO Audit_DDL_Events
VALUES
(
REPLACE(CONVERT(varchar(50),
@event.query('data(/EVENT_INSTANCE/PostTime)')), 'T', ' ')
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/LoginName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/UserName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/DatabaseName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/SchemaName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/ObjectName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/ObjectType)'))
,
CONVERT(varchar(max),
@event.query('data(/EVENT_INSTANCE/TSQLCommand/CommandText)'))
);
还必须为来自 EVENTDATA XML 的审计数据创建一个适当的存储表:
CREATE TABLE Audit_DDL_Events
(
DDL_Event_Time datetime
,
DDL_Login_Name varchar(150)
,
DDL_User_Name varchar(150)
,
DDL_Database_Name varchar(150)
,
DDL_Schema_Name varchar(150)
,
DDL_Object_Name varchar(150)
,
DDL_Object_Type varchar(150)
,
DDL_Command varchar(max)
);
您可以使用 DDL 触发器来跟踪数据库结构的更改。可以在此处找到有关该主题的好文章。
引用链接的文章
DDL 触发器...触发存储过程以响应事件。它们响应各种数据定义语言 (DDL) 事件而触发。这些事件由以关键字 CREATE、ALTER 和 DROP 开头的 T-SQL 语句指定。...这些用于管理任务,如审计和调节数据库操作。