有没有办法使用系统SQL Server函数获取数据库校验和?
或者快速弄清楚数据库中是否有任何变化的其他方法?
我不想为此使用任何特定的数据库分析软件。
我查找数据库中的任何更改(架构/对象更改,数据更改)。
我使用的是SQL Server 2008。
答案 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。