LINUX.ORG.RU
ФорумAdmin

[oracle][delete from][магия]

 ,


0

2

Привет, лор.

У меня загадка. Есть некая база на Oracle-10.2, а в ней табличка под названием UCHREJEDENIE (да-да, это то что ты подумал). Задача - удалить все записи в таблице с соблюдением констрейнов, ну короче так, чтобы не сломать приложение (название таблицы намекает на качество этого приложения). Делаю

delete from UCHREJEDENIE;

Девелопер радостно сообщает что N записей успешно удалено, делаю коммит а записи из таблицы не удаляются. Обновляю в девелопере таблицу - все записи на месте. Ручной селект выдает все записи.

Девелопер грит что к таблице привязан один триггер вот такой:

CREATE OR REPLACE TRIGGER "SVODY"."TBD_UCHREJEDENIE" before delete on UCHREJEDENIE for each row

Дак я его

alter trigger "SVODY"."TBD_UCHREJEDENIE" disable

девелопер сообщает, что триггер удачно отключет, но ситуация с таблицей не меняется.

Какие еще идеи в чем может быть проблема ?

А вы уверены, что у вас не такой случай:

CREATE TABLE UCHREJEDENIE(id number(10) not null, name varchar2(10));
CREATE TRIGGER "SVODY"."TBD_UCHREJEDENIE" before delete on UCHREJEDENIE for each row ...;
CREATE VIEW V_UCHREJEDENIE as SELECT * from UCHREJENIE;
CREATE TRIGGER "SVODY"."TBD_V_UCHREJEDENIE" instead of delete on V_UCHREJEDENIE for each row ...;
CREATE PUBLIC SYNONYM UCHREJEDENIE FOR V_UCHREJEDENIE;

Nastishka ★★★★★
()

Просто триггер может помешать удалению только сделав RAISE исключения, а если у вас исключения нет - значит удаления не происходит, а значит вы работаете не с таблицей, а с чем-то над таблицей.

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

Ну во первых: как бы тогда мне девелопер сообщал, что он из вьюхи удачно удалил несколько записей ? Во вторых UCHREJEDENIE это таки таблица вот ддл

CREATE TABLE "SVODY"."UCHREJEDENIE"
  (
    "NAME" VARCHAR2(1300 BYTE),
    "CODE" VARCHAR2(700 BYTE),
    "GLAVNOEUCHREJEDENIE_ID" RAW(16),
..............................

а синонимов в базе вообще нету.

s9gf4ult ★★
() автор топика
Ответ на: комментарий от Nastishka

Да я тоже думал что триггер, но в любом случае, если триггер на давал удалять вызывая исключение, то операция не могла завершиться успешно.

s9gf4ult ★★
() автор топика
Ответ на: комментарий от s9gf4ult

> как бы тогда мне девелопер сообщал, что он из вьюхи удачно удалил несколько записей?

Если триггер над представлением просто сделал RETURN, то как раз и получится такая ситуация - запрос отработал, триггер отработал (сделал RETURN) не сделав удаления, девелопер написал что удалил (триггер то отработал!), а строки остались. Ваша ситуация, кстати :-)

Nastishka ★★★★★
()
Ответ на: комментарий от s9gf4ult

> если триггер на давал удалять вызывая исключение

Есть конечно еще один вариант, что для foreign key используется deferred constraint, но тогда бы исключение выскочило при commit, хотя в некоторых случаях оно у меня в тестах не выскакивало

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

foreign key используется deferred constraint

Да !!! есть такое ! вот так вот выглядит

    CONSTRAINT "PK_UCHREJEDENIE" PRIMARY KEY ("ID") DEFERRABLE INITIALLY DEFERRED USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" ENABLE,
    CONSTRAINT "FK_UCHREJEDENIE_$$B236" FOREIGN KEY ("USERPROFILE_ID") REFERENCES "ZDRAV"."USERPROFILE" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE,
    CONSTRAINT "FK_UCHREJEDENIE_$$B232" FOREIGN KEY ("GLAVNOEUCHREJEDENIE_ID") REFERENCES "ZDRAV"."UCHREJEDENIE" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE,
    CONSTRAINT "FK_UCHREJEDENIE_$$B234" FOREIGN KEY ("KINDUCHREJEDENIYA_ID") REFERENCES "ZDRAV"."KINDUCHREJEDENIYA" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE,
    CONSTRAINT "FK_UCHREJEDENIE_$$B235" FOREIGN KEY ("TERRITORIALNOEOTNOSHENIE_ID") REFERENCES "ZDRAV"."TERRITORIALNOEOTNOSH" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE,
    CONSTRAINT "FK_UCHREJEDENIE_$$B233" FOREIGN KEY ("TYPEUCHREJEDENIYA_ID") REFERENCES "ZDRAV"."TYPEUCHREJEDENIYA" ("ID") DEFERRABLE INITIALLY DEFERRED ENABLE
  )
s9gf4ult ★★
() автор топика
Ответ на: комментарий от Nastishka

вот это прикольно

SQL> delete from uchrejedenie;

131 rows deleted.

SQL> select count(*) from uchrejedenie;

  COUNT(*)
----------
         0

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02292: integrity constraint (ZDRAV.FK_ELEMENTCEPOCHKI_$$B206) violated -
child record found


SQL> select count(*) from uchrejedenie;

  COUNT(*)
----------
       131

s9gf4ult ★★
() автор топика
Ответ на: комментарий от s9gf4ult

Что и требовалось доказать. Причина найдена, далее по итуации разберетесь :-)

Nastishka ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.