2014-01-19 8 views
3

Я создал соединение в SQL Developer и добавил несколько таблиц в базу данных. Кроме того, я определил некоторые триггеры. Все они хорошо работают, за исключением тех, которые дают ошибку «идентификатор слишком долго». Я знаю ограничение на 30 символов, но я не вижу, что вызывает эту конкретную ошибку. С помощью этого кода я пытаюсь реализовать клавиши короткого замыкания.Oracle DB - идентификатор слишком длинный

Таблицы:
Izvestaj (IzvestajID, Датум, Opis, Tekst, PredmerID, NarucilacID, OsobaID, IzvrsilacID)
Predmer (PredmerID, Датум, 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' 

Что может вызвать эту ошибку? Я пробовал несколько вещей, даже переименование триггеров, таблиц и столбцов на однобуквенные имена, но без каких-либо успехов.
P.S. Извините за именование. Я не хотел переводить имена таблиц и столбцов на английский, потому что они отличались бы их длиной, что, по-видимому, вызывало ошибку в первую очередь.

ответ

10

Эти строки:

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 

, который явно не будет работать.

Надеюсь, что это поможет.

+1

Вот и все. Спасибо чувак. –

Смежные вопросы