【问题标题】:How to track changes in table structure in Sql Server如何在Sql Server 中跟踪表结构的变化
【发布时间】:2023-04-08 12:29:02
【问题描述】:

我有一个包含三列(姓名、年龄、城市)的表格。现在,如果某个时候有人在表格中添加了一个额外的列(国家)。我如何知道哪一列已添加到表中,即国家/地区。

有什么方法可以跟踪表结构的变化,每当有人更改表结构时?

【问题讨论】:

    标签: sql-server database audit


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以使用 DDL 触发器来跟踪数据库结构的更改。可以在here 找到关于该主题的好文章。

      第三方编辑

      引用链接的文章

      DDL 触发器...触发存储过程以响应事件。他们 火响应各种数据定义语言(DDL) 事件。这些事件由 T-SQL 语句指定,这些语句是 从关键字 CREATE、ALTER 和 DROP 开始。 ...这些用于审计和监管等管理任务 数据库操作。

      【讨论】:

      • 我不需要跟踪数据库结构的变化,但我想跟踪表结构的变化。
      • 是的,DDL 触发器是在结构出现修改时触发的 sql server 事件,您可以使用它们来跟踪更改。只需查看我链接的文章即可。
      • 您能否提供一些示例或示例以完成任务。请回复。
      • 文档(带有示例)在 technet 上。 technet.microsoft.com/en-us/library/ms175941.aspx
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多