检查SQL Server数据库的更改?

3

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

或者其他快速了解数据库是否有任何更改的方法?

我不想使用任何特定的数据库分析软件来完成这个任务。

我要查找数据库中的任何更改(模式/对象更改,数据更改)。

我使用的是SQL Server 2008。


1
你是在谈论模式/对象的更改还是数据的更改,还是两者都有? - AdaTheDev
1
Microsoft SQL Server 的哪个版本? - mrdenny
为什么你不想使用任何特定的数据库分析软件? - codeulike
我不想使用分析软件,因为我将从代码中使用此功能。 - Pavlo Neiman
5个回答

4
你可能会在交易日志中找到相关信息...
使用
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日志中计算行数。 - Pavlo Neiman
问题在于你不想使用第三方工具,但又要求使用系统函数。就是这样。 - Yves M.
是的,你说得对。那正是我想要的。如果数据库中有类似CHECKSUM_AGG的东西就太好了。https://dev59.com/XXVD5IYBdhLWcg3wXamd - Pavlo Neiman

1

记录/日志模式更改的一种方法是使用自 SQL Server 2005 起的DDL 触发器

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


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

0

0

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

模式更改也可以通过触发器处理,这将更新表格的表格。也许在您的情况下,我们可以有附加的列,其数据类型为BOOL,指定更改是在模式还是数据中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接