检查SQL Server数据库的更改?

时间:2010-11-30 08:55:15

标签: sql sql-server database tsql

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

或者快速弄清楚数据库中是否有任何变化的其他方法?

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

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

我使用的是SQL Server 2008。

5 个答案:

答案 0 :(得分:3)

您可以在交易记录中找到相关信息......

使用

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

通过“更改”,我遇到了类似的问题,但没有更改数据,而是更改了架构。我创建了以下函数,以基于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

答案 3 :(得分:0)

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

还可以通过触发器来处理模式更改,这些触发器将更新表的表。在您的情况下,我们可以使用BOOL数据类型的其他列,以指定更改是在架构还是数据中。

答案 4 :(得分:0)

我发现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