数据库触发器

时间:2014-11-18 19:32:22

标签: sql triggers

我没有编写数据库触发器的经验,但我在当前项目中需要一个。

我的用例如下。我有两张桌子 - 表1和表2。

这些表格的关系为1:m。

我的用例是,如果表1中的所有记录都有" VALUE2"比Table2中的值更新为VALUE2。 因此,如果table1的ID 3的记录值更新为VALUE2,则表2的值也应更新为value2。

如果有人可以帮助我,那就太好了 - 谢谢你的光临!

TABLE1

ID    FK_Table2        VALUE
-----------------------------
1        77           VALUE2
2        77           VALUE2
3        77           VALUE1
4        54           OTHERVALUE

TABLE2

ID       VALUE
---------------
77       VALUE1  

2 个答案:

答案 0 :(得分:0)

所以你需要先学习并尝试basic trigger

CREATE OR REPLACE TRIGGER trigger_name 
AFTER UPDATE ON TABLE1
FOR EACH ROW

BEGIN
      /* trigger code goes here...*/
      /* for this particular case you need to update value of table2 */
      UPDATE TABLE2 SET VALUE = new.VALUE WHERE TABLE2.ID = new.FK_Table2 ;


END 

尝试编写一些代码。如果被卡住......回来告诉我们......

答案 1 :(得分:0)

无论哪种系统,都应该了解一些基本规则或最佳实践。一个是触发器返回并查询为其写入触发器的表,这是一种糟糕的形式(并且在许多系统中是完全禁止的)。您的用例要求Table1上的触发器在Update操作期间返回并从Table1读取。不好。

一个可用选项是使用存储过程来处理此表的所有更新。它们更难以使用(例如:如果参数为NULL,这是否意味着在相应的字段中放置NULL或保持未修改?)。出于这个原因,并且理解这是基于问题中有限的信息量,我建议使用两种替代方案中的一种。

一种是使用仅用于更改VALUE字段的存储过程。该领域不是在真空中改变,而是作为更大过程的一部分。实际上最终改变字段的过程中的步骤可以调用SP。

另一种方法是在桌子前面加上"而不是"触发并通过视图执行所有DML。这是我更喜欢的方法,至少在那些允许在视图上触发的系统上。视图触发器可以根据需要查询基础表。

至于逻辑(SP或触发器),这里有一些伪代码:

-- Make the update
update table1 set value = @somevalue
 where id = @someid;
-- Get the group that id is in
select FK_Table2 into @somegroupid
  from Table1
 where id = @someid;
-- Are all the values in that group the same?
select count(*) into @OtherValues
  from Table1
 where FK_Table2 = @somegroupid
   and value <> @somevalue;
-- If so, notify the other table.
if @OtherValues = 0 then
    update table2 set value = @somevalue
     where id = @somegroupid;

我希望这可以回答你当前的问题。但是,根据您在此处向我们展示的内容,问题的主要原因似乎是设计不佳。让我们知道您要填写的更高级别的要求,我敢打赌,我们可以提出一些建模更改,这样可以使这很容易,而不必使用SP或触发器非常聪明。