.net 检测数据库更改

.net 检测数据库更改,.net,sql-server,.net,Sql Server,我希望能够检测SQL Server数据库中表(而不是数据)结构的更改。然而,我不知道我到底在找什么 我不需要确切的更改,也不需要立即通知我。我还只需要更改表结构,而不需要更改实际数据 对于我可以从数据库中查询的每个表,只需一个简单的LastChangeDate就足够了,但我还没有看到类似的东西 原因:我们有一个.NET应用程序,它在复制行的同时修改一些值以将行“绑定”到其他用户。然而,我们遇到了一些麻烦,有人会对数据库进行更改,然后应用程序就会过时。如果数据库更改没有反映在应用程序中,那么让用户

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

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

对于我可以从数据库中查询的每个表,只需一个简单的
LastChangeDate
就足够了,但我还没有看到类似的东西

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


非常感谢。

创建DDL触发器以跟踪所有模型更改,包括登录名、日期、对象名、修改语句和所有其他您可能需要的内容:

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

您只能定义所需的事件。如果不需要,您可以避免跟踪
创建用户
语句等:

创建触发器安全性
在数据库上
对于DROP\u TABLE,更改\u TABLE
AS
打印“您必须禁用触发器“安全”才能删除或更改表格!”
回滚


制作一张记录此类事件的表格,并查看它以确定自上次审核以来是否发生了任何更改。

如果我正确理解了您的问题,这可能会有所帮助。它只是获取数据库的表模式并将其加载到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");

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

EXEC sp_updateextendedproperty 
    @name = N'MyApplication DB Version', @value = '1.2';
go
您的应用程序在连接到DB后,首先会检查此属性并验证它是否可以与当前版本一起使用。如果没有,则显示一个衰减,敦促用户下载最新的应用程序版本,然后退出。这家公司已经做了一年了

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


顺便说一句,我的公司专门监控这些变化,当任何变化发生时,无论它是如何发生的,你都可以得到通知。

Ah,太棒了。我喜欢。谢谢这会很好,但这需要对我们的数据库进行大量更改。他更多的是寻找一个快速而肮脏的解决方案。如果这是一个新项目,那可能会很棒。谢谢