Oracle DB - 标识符太长

Posted

技术标签:

【中文标题】Oracle DB - 标识符太长【英文标题】:Oracle DB - identifier too long 【发布时间】:2014-02-08 20:26:01 【问题描述】:

我在 SQL Developer 中创建了一个连接,并在数据库中添加了几个表。另外,我定义了一些触发器。除了出现“标识符太长”错误之外,它们都运行良好。我知道 30 个字符的限制,但我看不出是什么导致了这个特定的错误。使用此代码,我正在尝试实现短路键。

表格:IzvestajIzvestajID、Datum、Opis、Tekst、PredmerID、NarucilacID、OsobaID、IzvrsilacID)PredmerPredmerID、Datum、Naziv、IzvrsilacID、LokacijaID)IzvrsilacIzvrsilacID、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'

什么可能导致此错误?我尝试了几件事,甚至将触发器、表和列重命名为一个字母的名称,但没有任何成功。 附:对不起命名。我不想将表名和列名翻译成英文,因为它们的长度会有所不同,这似乎首先会导致错误。

【问题讨论】:

【参考方案1】:

这些行:

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 - 标识符太长的主要内容,如果未能解决你的问题,请参考以下文章

Liferay 6.2 - ORA-00972:通知portlet的标识符太长

Oracle DB - ORA-00904:选择时出现“无效标识符”错误

更新时标识符无效 (Oracle)

Laravel 5迁移标识符名称太长

Laravel 迁移主(或键)“标识符名称太长”

ORA-00972: 标识符太长 - 在 Grails 中避免它的最佳策略