0

每次我尝试运行我的数据库脚本时,我都会到达具有我的 2 个触发器的最后几行,并且我的脚本在编译第一个触发器后停止。

这些是我拥有的 2 个触发器,它编译“Player Round Trigger”,然后脚本停止并且没有到达我的第二个触发器“Handicap Trigger”

--
-- Player Round Trigger
--
CREATE TRIGGER playerRoundUpdateAudit BEFORE UPDATE ON PlayerRound
  FOR EACH row BEGIN
    INSERT INTO PlayerRoundAudit(old_data_PlayerID, old_data_RoundID, old_data_Holenumber, old_data_holeScore,
    new_data_PlayerID, new_data_RoundID, new_data_Holenumber, new_data_holeScore, tbl_name) 
    VALUES (OLD.playerID, OLD.roundID, OLD.holeNumber, OLD.holeScore, NEW.playerID, NEW.roundID, NEW.holeNumber, NEW.holeScore, "PlayerRound");
END;
/


--
-- Handicap Trigger
--
CREATE TRIGGER handicapUpdateAudit BEFORE UPDATE ON Handicap
  FOR EACH row BEGIN
    INSERT INTO HandicapAudit(old_data_handicapID, old_data_playerID, old_data_handicapDate, old_data_handicapScore,
    new_data_handicapID, new_data_playerID, new_data_handicapDate, new_data_handicapScore, tbl_name) 
    VALUES (OLD.handicapID, OLD.playerID, OLD.handicapDate, OLD.handicapScore, NEW.handicapID, NEW.playerID, NEW.handicapDate, NEW.handicapScore, "Handicap");
END;
/

我在 Oracle SQL Developer 版本 4.1.2.20(最新的 atm)中运行脚本

4

2 回答 2

3

实际上,第一个触发器编译时出错,并破坏了脚本。

您可以做一个实验 - 将第一个触发器的标题更改为CREATE OR REPLACE TRIGGER ....
然后在 SQL Developer 中单击第一个触发器将光标移动到它的代码中,然后按 Ctrl-Enter - 这将执行放置光标的一个语句(实际上 - 'CREATE ` 第一个触发器的语句)。

然后检查“编译器日志”窗口 - 你会看到这样的消息: 这个触发器有两个问题:在此处输入图像描述

  • 您正在使用OLD.column_nameand NEW.column_name,有什么问题。您需要使用:OLD.column_nameand :NEW.column_name,使用冒号作为前缀
  • 您在这里使用双引号而不是引号:"PlayerRound",Oracle 不会将其解释为字符串,而是作为标识符(变量、列名等)。'PlayerRound'改为在引号内使用。

更改第一个触发器,如下所示,它应该编译:

set define off
CREATE or replace TRIGGER playerRoundUpdateAudit BEFORE UPDATE ON PlayerRound
      FOR EACH row BEGIN
        INSERT INTO PlayerRoundAudit(old_data_PlayerID, old_data_RoundID,
                    old_data_Holenumber, old_data_holeScore,
                    new_data_PlayerID, new_data_RoundID, new_data_Holenumber, 
                    new_data_holeScore, tbl_name) 
        VALUES (:OLD.playerID, :OLD.roundID, :OLD.holeNumber, :OLD.holeScore, 
              :NEW.playerID, :NEW.roundID, :NEW.holeNumber, :NEW.holeScore, 'PlayerRound');
end;
/

您还需要更正第二个触发器,因为它包含类似的错误。


备注:放入SET DEFINE OFF脚本关闭变量替换,否则SQL-Developer会提示为每个:NEW和输入一个值:OLD

于 2015-12-20T21:54:38.363 回答
0

我对 Oracle SQL Developer 不是很熟悉,但是否可以选择将脚本作为“作为脚本执行”运行?此功能在 TOAD 上可用...

于 2015-12-20T21:07:30.740 回答