【问题标题】:Check for changes to a SQL Server database?检查对 SQL Server 数据库的更改?
【发布时间】:2011-05-17 18:04:10
【问题描述】:

有没有办法使用系统 SQL Server 函数获取数据库校验和?

或者其他快速判断数据库是否有变化的方法?

我不想为此使用任何特定的数据库分析软件。

我查找数据库中的任何更改(架构/对象更改、数据更改)。

我使用 SQL Server 2008。

【问题讨论】:

  • 您是在谈论架构/对象更改还是数据更改,或两者兼而有之?
  • 什么版本的 Microsoft SQL Server?
  • 你为什么不想使用任何特定的数据库分析软件?
  • 我不想使用分析软件,因为我会从代码中使用这个功能

标签: sql sql-server database tsql


【解决方案1】:

您可能会在事务日志中找到信息...

使用

DBCC LOG(<database name>[,{0|1|2|3|4}])

0 - 基本日志信息(默认)

1 - 冗长的信息

2 - 非常长的信息

3 - 详细

4 - 完整

例子:

DBCC log (MY_DB, 4)

结果有点神秘,最好与第三方工具一起使用......

致谢:http://www.mssqlcity.com/Articles/KnowHow/ViewLog.htm

编辑:

你可以试试

Select * from ::fn_dblog(null, null)

此页面包含有关函数返回结果的一些有用信息... http://www.novicksoftware.com/udfofweek/Vol1/T-SQL-UDF-Volume-1-Number-27-fn_dblog.htm

请记住,这些程序不面向公众,因此不易理解。另一种可能性是在所有表上添加触发器。但另一方面,这是很多工作。

【讨论】:

  • 我该如何分析这个结果?无法从 DBCC 日志计算行
  • 这里的问题是您不想使用第三方工具并且您要求系统功能。就是这样。
  • 是的,你是对的。那是我真正想要的。如果存在这样的数据库就好了 CHECKSUM_AGG stackoverflow.com/questions/36/check-for-changes-to-a-sql-table
【解决方案2】:

记录/记录架构更改的一种方法是使用自 SQL Server 2005 起的DDL triggers

您可以在数据库上设置它们以触发特定类型的架构更改(例如 CREATE_PROCEDURE、ALTER_PROCEDURE),然后维护您想要的任何日志。

【讨论】:

    【解决方案3】:

    通过“更改”,我遇到了类似的问题,但没有更改数据,而是更改了架构。我创建了以下函数来生成基于 INFORMATION_SCHEMA 的整个数据库模式的校验和。如果您的系统使用它们,请扩展到其他信息架构表,这对我的使用来说已经足够了。

    我使用它创建了一个每日警报,以通知我生产数据库的任何更改,因此可以轻松监管其他团队成员的计划外/未经授权的更改。只需存储校验和,然后运行该函数并与存储的值进行比较。如果不同,那么有人改变了一些东西。

    CREATE FUNCTION [dbo].GetDbSchemaChecksum 
    (   
    )
    RETURNS int
    AS
    BEGIN
        declare @retVal int
        set @retVal = 
        (
        SELECT 
            CHECKSUM_AGG(T.Chk) DbSchemaChecksum
        FROM
            (
            select checksum(TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE) Chk from INFORMATION_SCHEMA.TABLES
            union all
            select checksum(TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, DATETIME_PRECISION) Chk from INFORMATION_SCHEMA.COLUMNS
            union all
            select checksum(CONSTRAINT_SCHEMA, CONSTRAINT_NAME, UNIQUE_CONSTRAINT_CATALOG, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE) Chk from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
            union all
            select checksum(CONSTRAINT_NAME, TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_TYPE, IS_DEFERRABLE, INITIALLY_DEFERRED) Chk from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
            union all
            select checksum(TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_SCHEMA, CONSTRAINT_NAME) Chk from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
            union all
            select checksum(CONSTRAINT_SCHEMA, CONSTRAINT_NAME, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION) Chk from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
            union all
            select checksum(CONSTRAINT_SCHEMA, CONSTRAINT_NAME, CHECK_CLAUSE) Chk from INFORMATION_SCHEMA.CHECK_CONSTRAINTS 
            union all
            select checksum(TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION, CHECK_OPTION, IS_UPDATABLE) Chk from INFORMATION_SCHEMA.VIEWS
            union all
            select checksum(VIEW_SCHEMA, VIEW_NAME, TABLE_SCHEMA, TABLE_NAME) Chk from INFORMATION_SCHEMA.VIEW_TABLE_USAGE
            union all
            select checksum(SPECIFIC_SCHEMA, SPECIFIC_NAME, ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, ROUTINE_DEFINITION) Chk from INFORMATION_SCHEMA.ROUTINES
            union all
            select checksum(SPECIFIC_SCHEMA, SPECIFIC_NAME, ORDINAL_POSITION, PARAMETER_MODE, IS_RESULT, AS_LOCATOR, PARAMETER_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH) Chk from INFORMATION_SCHEMA.PARAMETERS
            ) AS T
        )
    
        return @retVal
    
    END
    GO
    

    【讨论】:

      【解决方案4】:

      更新/插入/删除形式的表更新可以通过使用触发器来跟踪,该触发器将更新主表中的时间戳。我们必须维护一个包含表名称和上次更新时间的表。单个表中的任何更改都会更新相应行中的此表!

      架构更改也可以通过更新表的触发器来处理。可能在你的情况下,我们可以有额外的 BOOL 数据类型的列来指定更改是在模式还是数据中。

      【讨论】:

        【解决方案5】:

        我发现 SQL Server 2008+ 企业版有一个功能叫Change Data Capture

        这将捕获数据库上的任何插入、更新、删除。不幸的是,我没有企业版来测试这一点。我将在此处添加链接,以便将来对某人有所帮助。

        Enable/Disable Change Data Capture

        Good writeup on how to use this feature

        编辑: 对于标准版,有Change Tracking

        相关问题: Auditing SQL Server data changes

        【讨论】:

          猜你喜欢
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-13
          相关资源
          最近更新 更多