使用触发器维护两个数据库中类似表的数据完整性

时间:2016-05-16 17:42:27

标签: sql-server database-trigger

我有两个SQL Server数据库。

一个被用作Ruby-On-Rails系统的后端,我们正在转换但仍在使用,因为我们在ASP.NET MVC中重写了Ruby应用程序。

对于Users,Roles和Roles-Users表,数据库具有类似的表,但不完全相同。

我想创建某种类型的触发器,以便在对同一个表的另一个数据库进行修改时更新每个数据库上的用户和roles-users表。

我不能只使用原始数据库上的users表,因为Ruby对密码有不同的哈希函数,但我想确保一个系统上的更改反映在另一个系统上。

我还想避免一个明显的问题,即一个数据库上的更新触发另一个数据库的更新,触发第一个上的更新,并且该过程重复自身,直到服务器崩溃或发生类似的不良事件或发生死锁。

我不想使用数据库复制。

在每个交易的交易基础上有一种简单的方法吗?

修改

触发器在概念上是这样的:

USE Original;
GO

CREATE TRIGGER dbo.user_update
ON dbo.user WITH EXECUTE AS [cross table user identity]
AFTER UPDATE
AS
BEGIN
   UPDATE Another.dbo.users SET column1=value1, etc., WHERE inserted.ID = Another.dbo.users.ID;
END

我试图避免的问题是递归调用。

Another.dbo.users将在它上面有类似的触发器,因为这两个数据库有不同类型的应用程序,一个是Ruby-On-Rails,另一个是ASP.NET MVC,可能正在处理数据在两个数据库上应该是相同的。

1 个答案:

答案 0 :(得分:0)

如果可能,我会在两个表中添加一个字段。当添加或更新表时,'check'字段将被设置为0.触发器将查看此字段,如果它是0,由应用程序事件生成,则触发器将插入/更新激发到第二个表但是检查字段的值为1而不是0。

因此当触发器在第二个表上触发时,它将跳过插入表1。

这将解决递归问题。

如果由于某种原因您无法添加检查字段,则可以使用具有表的主键和检查字段的单独表。这需要更多编码,但也可以。