我没有编写数据库触发器的经验,但我在当前项目中需要一个。
我的用例如下。我有两张桌子 - 表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
答案 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或触发器非常聪明。