【发布时间】:2023-04-08 12:29:02
【问题描述】:
我有一个包含三列(姓名、年龄、城市)的表格。现在,如果某个时候有人在表格中添加了一个额外的列(国家)。我如何知道哪一列已添加到表中,即国家/地区。
有什么方法可以跟踪表结构的变化,每当有人更改表结构时?
【问题讨论】:
标签: sql-server database audit
我有一个包含三列(姓名、年龄、城市)的表格。现在,如果某个时候有人在表格中添加了一个额外的列(国家)。我如何知道哪一列已添加到表中,即国家/地区。
有什么方法可以跟踪表结构的变化,每当有人更改表结构时?
【问题讨论】:
标签: sql-server database audit
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 触发器来跟踪数据库结构的更改。可以在here 找到关于该主题的好文章。
引用链接的文章
DDL 触发器...触发存储过程以响应事件。他们 火响应各种数据定义语言(DDL) 事件。这些事件由 T-SQL 语句指定,这些语句是 从关键字 CREATE、ALTER 和 DROP 开始。 ...这些用于审计和监管等管理任务 数据库操作。
【讨论】: