有没有使用系统SQL Server函数获取数据库校验和的方法?
或者其他快速了解数据库是否有任何更改的方法?
我不想使用任何特定的数据库分析软件来完成这个任务。
我要查找数据库中的任何更改(模式/对象更改,数据更改)。
我使用的是SQL Server 2008。
有没有使用系统SQL Server函数获取数据库校验和的方法?
或者其他快速了解数据库是否有任何更改的方法?
我不想使用任何特定的数据库分析软件来完成这个任务。
我要查找数据库中的任何更改(模式/对象更改,数据更改)。
我使用的是SQL Server 2008。
DBCC LOG(<database name>[,{0|1|2|3|4}])
0 - 基本日志信息(默认)
1 - 详细信息
2 - 非常详细信息
3 - 详细程度高
4 - 完整信息
示例:
DBCC log (MY_DB, 4)
Select * from ::fn_dblog(null, null)
记录/日志模式更改的一种方法是使用自 SQL Server 2005 起的DDL 触发器。
您可以在数据库上设置它们,以便在特定类型的模式更改(例如 CREATE_PROCEDURE、ALTER_PROCEDURE)时触发,并维护任何您想要的日志。
“更改”指的是我遇到了类似的问题,但不是数据的更改,而是架构的更改。我创建了以下函数,基于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
我发现 SQL Server 2008+ 企业版有一个叫做变更数据捕获的功能。
这将捕获数据库上的任何插入、更新、删除操作。不幸的是,我没有企业版来测试这个功能。我会在这里添加链接,以便将来有人可以从中受益。
编辑: 对于标准版,有变更跟踪。
相关问题: 审计 SQL Server 数据更改
通过使用触发器,可以跟踪以更新/插入/删除的形式更新表格的更改,并更新主表中的时间戳。我们必须维护一个包含表格名称和最后更新时间的表格。任何单个表格中的更改都会在相应行中更新此表格!
模式更改也可以通过触发器处理,这将更新表格的表格。也许在您的情况下,我们可以有附加的列,其数据类型为BOOL,指定更改是在模式还是数据中。