检测数据库更改

时间:2016-08-22 15:25:05

标签: .net sql-server

我希望能够检测到SQL Server数据库中表(而不是数据)结构的更改。但是,我不知道我到底在寻找什么。

我不需要确切的更改,也不需要立即通知我。我也只需要更改表结构,而不是实际数据。

我可以从数据库中查询每个表的LastChangeDate这样的简单事情就足够了,但我还没有看到类似的东西。

原因:我们有一个.NET应用程序复制行,同时将某些值修改为" bind"他们给其他用户。但是,我们遇到了麻烦,有人会对数据库进行更改,然后应用程序就会过时。如果数据库更改未在应用程序中反映,那么让用户使用该应用程序是非常危险的。我希望应用程序在打开时检查数据库结构自上次打开后是否发生了更改,如果是这样则自行锁定。由于应用程序不存在,因此它不能成为事件或触发器。我也不想在服务器上做太多改变(例如:启用更改跟踪不是一个可行的选择)

非常感谢。

3 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,这可能有所帮助。它只获取数据库的表模式并将其加载到DataTable中,然后可以将其保存到文件中,然后用作参考/比较。

using Microsoft.SqlServer.Server;
using SQL = System.Data;
using System.Data.SqlClient;

string DB_Name = "SomeDB" 

connectionString = "Server=" + System.Environment.MachineName.ToString() + 
                   "\\CUSQLEXPRESS;Database=" + 
                   DB_Name + ";Trusted_Connection=True;MultipleActiveResultSets=true;";

SQL_Connection = new SqlConnection(connectionString);
SQL_Connection.Open();

DataTable Project_Tables = SQL_Connection.GetSchema("Tables");

答案 1 :(得分:0)

使用登录名,日期,对象名,修改声明以及您可能需要的所有其他内容创建DDL触发器以跟踪所有模型更改:

https://msdn.microsoft.com/en-us/library/ms175941.aspx

  

DDL会响应各种数据定义语言(DDL)事件而触发。这些事件主要对应于以关键字CREATE,ALTER,DROP,GRANT,DENY,REVOKE或UPDATE STATISTICS开头的Transact-SQL语句。某些执行类似DDL操作的系统存储过程也可以触发DDL触发器。

您只能定义所需的事件。如果您不需要,则可以避免跟踪CREATE USER语句等等:

  

创造触发安全
  ON DATABASE
  对于DROP_TABLE,ALTER_TABLE
  AS
     打印'您必须禁用触发器"安全"丢弃或改变表格!'
     ROLLBACK;

为登录这样的事件创建一个表,并查看它以确定自上次审核以来是否发生了任何更改。

答案 2 :(得分:0)

我建议的解决方案是使用DB Migrations进行所有数据库结构修改。作为修改的一部分,您将更新数据库扩展属性:

EXEC sp_updateextendedproperty 
    @name = N'MyApplication DB Version', @value = '1.2';
go

您的应用在连接到数据库时首先检查此属性并验证它是否可以与当前版本一起使用。如果没有,显示渐弱,请用户下载最新的应用版本,然后退出。 Rails ecosystem一年来都在这样做。

如果每次更改都是通过升级完成的,则效果很好。但它没有涵盖不遵循程序并破坏应用程序的恶意更新问题。对于这种情况,我的建议是使用DDL触发器或事件通知并监视更新。您必须解析EVENTDATA()并更新某些表以及更新的详细信息,并让您的应用程序查阅该表。是可行的,但我认为不值得。我将重点放在使迁移方法可行并保持更新的规范(即修改扩展属性)。

作为旁注,我的公司DBHistory.com专门监控此类更改,您可以在任何更改发生时收到通知,无论 如何发生。