SQL 脚本在到达第一个触发器 END 后停止编译
SQL script stops compiling after reaching first trigger END
每次我尝试 运行 我的数据库脚本时,我都会到达包含我的 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 开发人员版本 4.1.2.20(最新的一台 atm)中安装脚本
我对 Oracle SQL Developer 不是很熟悉,但是是否可以选择 运行 脚本作为 "Execute as script"?此功能在 TOAD 上可用...
实际上第一个触发器编译错误,并破坏了脚本。
你可以做个实验——把第一个触发器的header改成CREATE OR REPLACE TRIGGER ....
,
然后在 SQL 开发人员中单击第一个触发器以将光标移动到它的代码中,然后按 Ctrl-Enter - 这将在放置光标的位置执行一个语句(实际上 - 第一个触发器的“CREATE”语句)。
然后检查 "Compiler log" window - 您将看到如下消息:
这个触发器有两个问题:
- 您正在使用
OLD.column_name
和 NEW.column_name
,有什么问题。您需要使用 :OLD.column_name
和 :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
输入一个值
每次我尝试 运行 我的数据库脚本时,我都会到达包含我的 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 开发人员版本 4.1.2.20(最新的一台 atm)中安装脚本
我对 Oracle SQL Developer 不是很熟悉,但是是否可以选择 运行 脚本作为 "Execute as script"?此功能在 TOAD 上可用...
实际上第一个触发器编译错误,并破坏了脚本。
你可以做个实验——把第一个触发器的header改成CREATE OR REPLACE TRIGGER ....
,
然后在 SQL 开发人员中单击第一个触发器以将光标移动到它的代码中,然后按 Ctrl-Enter - 这将在放置光标的位置执行一个语句(实际上 - 第一个触发器的“CREATE”语句)。
然后检查 "Compiler log" window - 您将看到如下消息:
这个触发器有两个问题:
- 您正在使用
OLD.column_name
和NEW.column_name
,有什么问题。您需要使用:OLD.column_name
和: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
输入一个值