利用触发器来保持两个表的同步

日期: 2009-09-09 作者:Denny Cherry翻译:孙瑞 来源:TechTarget中国 英文

问:我需要创建一个触发器以保持两个独立数据库表的一致性。在更改被应用之前,是否有方法可以让触发器验证其它数据库/表中不存在的更新呢?如果更改已经存在,我不想遭遇触发器无限循环的问题。例如:   新的纪录被添加到表A。触发器可以在插入命令执行前检验表B是否已经有记录了。

如果表B被更改,触发器可以再更新命令执行前检验表A的更改是否已经存在了。   我使用的是SQL Server 2005来创建触发器。我没有访问任何的管理员工具或数据服务。   答:是的,当然可以做到这一点。

这只需要一些额外的触发器逻辑位。你需要对列名做出相应的修改以对你的表进行匹配。如果你不需要嵌套的触发器,可以通过sp_conf……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

问:我需要创建一个触发器以保持两个独立数据库表的一致性。在更改被应用之前,是否有方法可以让触发器验证其它数据库/表中不存在的更新呢?如果更改已经存在,我不想遭遇触发器无限循环的问题。例如:

  新的纪录被添加到表A。触发器可以在插入命令执行前检验表B是否已经有记录了。如果表B被更改,触发器可以再更新命令执行前检验表A的更改是否已经存在了。

  我使用的是SQL Server 2005来创建触发器。我没有访问任何的管理员工具或数据服务。

  答:是的,当然可以做到这一点。这只需要一些额外的触发器逻辑位。你需要对列名做出相应的修改以对你的表进行匹配。如果你不需要嵌套的触发器,可以通过sp_configure系统存储过程关闭嵌套触发器。

  CREATE TRIGGER Trigger1 ON Table1
  FOR
  INSERT, UPDATE
  AS
  BEGIN
  IF NOT EXISTS (SELECT * FROM deleted)
  BEGIN
  INSERT INTO Table2
  (YourColumns...)
  SELECT YourColumns
  FROM inserted
  WHERE NOT EXISTS (SELECT * FROM Table2 WHERE inserted.PrimaryKey = Table2.PrimaryKey)
  END
  ELSE
  BEGIN
  UPDATE Table2
  SET YourColumn1 = inserted.YourColumn1,...
  FROM inserted
  WHERE inserted.PrimaryKey = Table2.PrimaryKey
  AND (inserted.YourColumn1 <> Table2.YourColumn1
  OR inserted.YourColumn2 <> Table2.YourColumn2
  OR ...)
  END
  END
  GO
  CREATE TRIGGER Trigger2 ON Table2
  FOR
  INSERT, UPDATE
  AS
  BEGIN
  IF NOT EXISTS (SELECT * FROM deleted)
  BEGIN
  INSERT INTO Table1
  (YourColumns...)
  SELECT YourColumns
  FROM inserted
  WHERE NOT EXISTS (SELECT * FROM Table1 WHERE inserted.PrimaryKey = Table1.PrimaryKey)
  END
  ELSE
  BEGIN
  UPDATE Table1
  SET YourColumn1 = inserted.YourColumn1,...
  FROM inserted
  WHERE inserted.PrimaryKey = Table1.PrimaryKey
  AND (inserted.YourColumn1 <> Table1.YourColumn1
  OR inserted.YourColumn2 <> Table1.YourColumn2
  OR ...)
  END
  END
  GO

翻译

孙瑞
孙瑞

相关推荐