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



我有两个SQL Server数据库。

其中一个被用作Ruby On Rails系统的后端,我们正在从该系统过渡,但由于我们正在ASP.NET MVC中重写Ruby应用程序,该系统仍在使用中。

对于"用户"、"角色"one_answers"角色-用户"表,数据库具有相似但不完全相同的表。

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

我不能只使用原始数据库上的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.user将有一个类似的触发器,因为这两个数据库有不同类型的应用程序,一个是Ruby on Rails,另一个是ASP.NET MVC,它们可能正在处理两个数据库上应该相同的数据。

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

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

这将解决递归问题。

如果由于某些原因无法添加校验字段,则可以使用一个单独的表,其中包含表和校验字段的主键。这需要更多的编码,但也可以。

最新更新