我在 SQL Developer 中创建了一个连接并向数据库添加了几个表。另外,我定义了一些触发器。除了给出“标识符太长”错误的一个之外,它们都运行良好。我知道 30 个字符的限制,但我看不出是什么导致了这个特定错误。使用此代码,我正在尝试实现短路键。
表:
Izvestaj (IzvestajID、Datum、Opis、Tekst、PredmerID、NarucilacID、OsobaID、IzvrsilacID)
Predmer (PredmerID、Datum、Naziv、IzvrsilacID、LokacijaID)
Izvrsilac (IzvrsilacID,Naziv)
斜体值表示关系(表)的主键。
触发器:
create or replace TRIGGER "T_IZM_IZV"
AFTER UPDATE OF IZVRSILACID ON PREDMER
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE ('ALTER TRIGGER'||'T_ZABRANA_IZM_IZV'||'DISABLE');
UPDATE IZVESTAJ SET IZVRSILACID=:NEW.IZVRSILACID
WHERE PREDMERID=:NEW.PREDMERID;
EXECUTE IMMEDIATE ('ALTER TRIGGER'||'T_ZABRANA_IZM_IZV'||'ENABLE');
END;
create or replace TRIGGER "T_ZABRANA_IZM_IZV"
BEFORE UPDATE OF IzvrsilacID ON Izvestaj
FOR EACH ROW
BEGIN
RAISE_APPLICATION_ERROR(-20000, 'Direct altering of IzvrsilacID is forbidden');
END;
我在表“Predmer”中添加了一些行(Izvrsilac 和 Izvestaj 也插入了一些值),当我尝试更改列“IzvrsilacID”(外键)的值时,出现错误:
UPDATE "KORISNIK"."PREDMER" SET IZVRSILACID = '1' WHERE ROWID = 'AAAFBRAABAAALDxAAB' AND ORA_ROWSCN = '675526'
ORA-00972: identifier is too long
ORA-06512: at "KORISNIK.T_IZM_IZV", line 4
ORA-04088: error during execution of trigger 'KORISNIK.T_IZM_IZV'
One error saving changes to table "KORISNIK"."PREDMER":
Row 2: ORA-00972: identifier is too long
ORA-06512: at "KORISNIK.T_IZM_IZV", line 4
ORA-04088: error during execution of trigger 'KORISNIK.T_IZM_IZV'
什么可能导致此错误?我尝试了几件事,甚至将触发器、表和列重命名为一个字母的名称,但都没有成功。
附言对不起命名。我不想将表名和列名翻译成英文,因为这会使它们的长度不同,这似乎首先会导致错误。
最佳答案
这些线路:
EXECUTE IMMEDIATE ('ALTER TRIGGER'||'T_ZABRANA_IZM_IZV'||'DISABLE');
EXECUTE IMMEDIATE ('ALTER TRIGGER'||'T_ZABRANA_IZM_IZV'||'ENABLE');
应该是这样的:
EXECUTE IMMEDIATE ('ALTER TRIGGER '||'T_ZABRANA_IZM_IZV'||' DISABLE');
EXECUTE IMMEDIATE ('ALTER TRIGGER '||'T_ZABRANA_IZM_IZV'||' ENABLE');
注意添加的空格。
没有添加空格,您正在尝试执行:
ALTER TRIGGERT_ZABRANA_IZM_IZVDISABLE
和
ALTER TRIGGERT_ZABRANA_IZM_IZVENABLE
这显然行不通。
希望有帮助。
关于Oracle DB - 标识符太长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21220932/