使用两个数据表的sql触发器
所以我有三张桌子。前两个有ID列和“rank”列(一个整数)。我将在第三个表中插入两个ID(ID1,ID2),但我需要触发器检查它们是否是相同的秩,然后才能插入。我不能让它工作使用两个数据表的sql触发器,sql,oracle,triggers,Sql,Oracle,Triggers,所以我有三张桌子。前两个有ID列和“rank”列(一个整数)。我将在第三个表中插入两个ID(ID1,ID2),但我需要触发器检查它们是否是相同的秩,然后才能插入。我不能让它工作 CREATE OR REPLACE TRIGGER TRIGGER1 AFTER INSERT ON TABLE_C BEGIN IF NOT EXISTS ( SELECT TABLE_A.id, TABLE_B.id FROM TABLE_A JOIN TABLE_B ON TABLE_A.rank = TAB
CREATE OR REPLACE TRIGGER TRIGGER1
AFTER INSERT ON TABLE_C
BEGIN
IF NOT EXISTS (
SELECT TABLE_A.id, TABLE_B.id
FROM TABLE_A JOIN TABLE_B ON TABLE_A.rank = TABLE_B.rank
WHERE TABLE_A.id = inserted.id1 AND TABLE_B.id = inserted.id2 )
THEN
PRINT 'Not the same rank'
ROLLBACK
END
END;
我使用的是Oracle db。触发器有两种,
之前的触发器和之后的触发器。如果要在插入数据之前检查数据是否具有相同的秩,则应使用before触发器
CREATE OR REPLACE TRIGGER TRIGGER1
BEFORE INSERT ON TABLE_C
然后,逻辑将随之产生
更新:您可以轻松地进行更新。例如:
IF HasSameRank == 0 THEN
raise_application_error(-21013, 'Not the same rank');
END IF;
在Oracle触发器中不能使用“回滚”或“提交”-
我想你可以修改你的触发器如下-
CREATE OR REPLACE TRIGGER Trigger1
AFTER INSERT ON Table_c
FOR EACH ROW
DECLARE
l_Count NUMBER := 0;
BEGIN
SELECT COUNT(*)
INTO l_Count
FROM Table_a
JOIN Table_b ON Table_a.Rank = Table_b.Rank
WHERE Table_a.Id = :NEW.Id1
AND Table_b.Id = :NEW.Id2;
IF l_Count = 0 THEN
DELETE FROM Table_c
WHERE Id1 = :NEW.Id1
AND Id2 = :NEW.Id2;
--PRINT 'Not the same rank'
Dbms_Output.Put_Line('Not the same rank');
END IF;
END;
/
是的,很抱歉我尝试了这两种方法,但仍然有问题。@semihyagcioglu请建议如何在触发器中使用“插入前”条件使插入失败。。它说“错误(5,18):PLS-00103:在预期以下情况之一时遇到符号“TABLE_B:”),组具有intersect减去start union where connect”它说错误是连接所在的位置,在表上谢谢,这有很大帮助语法是如此错误。。。您看过任何Oracle触发器文档吗?