【问题标题】:SQL Server 2005 Table Alter HistorySQL Server 2005 表更改历史记录
【发布时间】:2010-04-06 07:56:10
【问题描述】:

SQL Server 是否维护任何历史记录来跟踪表更改,例如列添加、删除、重命名、类型/长度更改等?我发现许多建议使用存储过程手动执行此操作。但我很好奇 SQL Server 是否在任何系统表中保留了这样的历史记录?谢谢。

【问题讨论】:

    标签: sql sql-server sql-server-2005 sql-server-2000


    【解决方案1】:

    在 SQL Server 2005 及更高版本中,您可以创建数据库级触发器来跟踪表更改。使用类似的东西:

    CREATE TRIGGER [YourDatabaseTrigger]
    ON DATABASE
    FOR DDL_DATABASE_LEVEL_EVENTS
    AS
    
    DECLARE @EventData      xml
    DECLARE @Message        varchar(1000)
    SET @EventData=EVENTDATA()
    
    INSERT INTO YourLogTable 
        (EventDateTime,EventDescription) 
        VALUES (GETDATE(),SUSER_NAME()
                         +'; '+@EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(250)')
                         +'; '+@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(250)')
                         +'; '+@EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
               )
    RETURN
    GO
    
    ENABLE TRIGGER [YourDatabaseTrigger] ON DATABASE
    

    这是日志的一些简单输出:

    select * from YourLogTable
    EventID     EventDateTime           EventDescription
    ----------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------
    1           2010-04-06 08:25:47.333 sa; TABLE; YourLogTable2; create table YourLogTable2 (EventID int primary key identity(1,1),EventDateTime datetime, EventDescription varchar(max))
    2           2010-04-06 08:25:55.113 sa; TABLE; YourLogTable2; drop table YourLogTable2
    
    (2 row(s) affected)
    

    您可以扩展日志以包含更多列,或者像这个简单示例中那样将所有内容转储到一个列中。

    【讨论】:

    • 感谢 KM。但是我已经尝试过工作正常的 ddl 触发器,如果​​只将新列添加到表中,则可以轻松地使用日志信息。但我认为在日志中使用 TSQL 命令进行更改将是一项乏味的工作,例如重命名具有外键引用的列或更改 varchar 类型列的长度等。存储将很快成为 Unreason 的“问题”说。
    【解决方案2】:

    事务日志存储所有这些信息,DBCC LOG 命令应该让您查看这些信息,但它是一个未记录的命令。

    DBCC LOG(<database name>[,{0|1|2|3|4}])  
    0 – Basic Log Information (default)  
    1 – Lengthy Info  
    2 – Very Length Info  
    3 – Detailed  
    4 – Full Example  
    

    语法:

    DBCC log (MY_DB, 4)  
    

    【讨论】:

      【解决方案3】:

      默认情况下,此类信息不会保留在任何 RDBMS 中,因为它可能会将所需的存储需求增加几个数量级,并可能严重降低性能。

      触发器可以为您做到这一点。触发器不被视为手动方法 - 它们是数据库设计的核心部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多