Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Вниз

триггер 


TAIS   (2002-01-02 09:47) [0]

Не работает триггер:
Приложение написано на DELPHI3, база- ORACLE8.1.5, связь через BDE. Почему при модификации данных через приложение не срабатывает триггер? А constraints срабатывают?



Desdechado   (2002-01-02 10:46) [1]

может, он отключен? или условие срабатывания не выполняется?
через приложение или с консоли - не играет роли.



TAIS   (2002-01-02 15:33) [2]

Триггер не отключен. В TOAD срабатывает, а через приложение нет.



petr_v_a   (2002-01-02 16:10) [3]

Тогда create table, текст триггера и запрос, при котором он не срабатывает - в студию



TAIS   (2002-01-02 17:36) [4]

Триггер на таблицу OGK.OGK_MODEL

TRIGGER OGK.OGK_TRIGGER
BEFORE INSERT ON OGK.OGK_MODEL
FOR EACH ROW
DECLARE
KOL NUMBER;
MY_EXCEPT EXCEPTION;
BEGIN
SELECT COUNT(*) INTO KOL FROM OGK.OGK_MODEL
WHERE NAME_MODEL =:NEW.NAME_MODEL;
IF KOL>0 THEN RAISE MY_EXCEPT;
END IF;
EXCEPTION
WHEN MY_EXCEPT THEN
RAISE_APPLICATION_ERROR (-20001,"Ошибка уникальности данных! NAME_MODEL="||:NEW.NAME_MODEL);
WHEN OTHERS THEN
Null;
END;
--------------------------------------------
Структура таблицы
CREATE TABLE OGK.OGK_MODEL (
ID_MODEL NUMBER (10) NOT NULL,
NAME_MODEL VARCHAR2 (50))
--------------------------------------------
На кнопке" Новая модель" - процедура:
procedure TForm3.Button7Click(Sender: TObject);
Var
MyQ:TQuery;
begin
MyQ:=TQuery.Create(Nil);
MyQ.DatabaseName:=DataModule2.DbOr.DatabaseName;
MyQ.SQL.Add("SELECT ID_MODEL.nextval ID FROM EMPTY");
MyQ.Active:=True;
DataModule2.QueryStanki.Insert;
DataModule2.QueryStanki.FieldByName("ID_MODEL").AsString
:= MyQ.FieldByName("ID").AsString;
MyQ.Destroy;
DataModule2.QueryStanki.Edit;
DataModule2.QueryStanki.Post;
DataModule2.QueryStanki.ApplyUpdates;
end;

Вставляю дублир. записи - никакой реакции (триггер включен), constraint UNIQUE (NAME_MODEL)- выключен.
Выключаю триггер, включаю constraint- реагирует на дубл. записи!
В студии информации достаточно?



petr_v_a   (2002-01-02 17:59) [5]

Навскидку скользко
when others then null - все другие ошибки подавлены, и триггер-то, возможно, срабатывает, возникает какая-то неприятность и тихо гаснет. Если нет, будем дальше разбираться



TAIS   (2002-01-03 08:54) [6]

Триггер-то через TOAD работает!
Хорошо, комментирую "when others then null"-результат тот же.
Через программу не работает!
А BDE(v 5.01) (Native драйвер ORACLE) поддерживает триггеры или только Constraints-ы? Разобраться в этом уже дело принципа.



Davojan   (2002-01-03 11:33) [7]

Честно: в ORACLE, к сожалению, особо не разбираюсь, но разбираюсь в триггерах и клиент-серверной архитектуре вообще. В связи с этим скажу: здесь BDE не причём и быть виновным не может по той причине, что это клиентское ПО и может даже понятия не иметь о триггерах, а триггеры исполняются на стороне сервера независимо от того: хочет этого клиент или нет (если триггер, конечно, не выключен).
Интуиция мне подсказывает, что дело в обработчике кнопки. Но где точно ошибка сказать не могу, т.к. никогда не работал с кэшированными изменениями. Могу сказать что мне не нравится этот кусок:
DataModule2.QueryStanki.Edit;
DataModule2.QueryStanki.Post;


И ещё: насколько я понимаю эта строка:
MyQ.SQL.Add("SELECT ID_MODEL.nextval ID FROM EMPTY");
отвечает за уникальность ключа. Если так, то по-моему эту операцию как раз лучше производить с помощью триггера (сама концепция этого требует) или вообще можно создать хранимую процедуру, которая всё это дело будет осуществлять.
Удачи.



petr_v_a   (2002-01-03 11:37) [8]

еще select count(*)... не увидит незакоммиченные записи.

Насчет "А BDE(v 5.01) (Native драйвер ORACLE) поддерживает триггеры или только Constraints-ы?" - вопрос некорректный - триггеры,Constraints-ы и пр.пауки со змеями - механизмы сервера, а BDE(v 5.01) с Native драйвером - прослойка промеж приложением и API клиентской части Oracle (OCI)



petr_v_a   (2002-01-03 11:48) [9]

И согласен с Davojan ©
Еще может быть, что insert-запрос реально не происходит при post/ApplyUpdates ( посмотрите под SQL-монитором, что инсертится и когда )



keg   (2002-01-03 12:05) [10]

Вообще как-то криво все это сделано. Если делаешь Insert, то Edit уже делать не надо, а сразу делать Post. Кстати, может поэтому триггер и не срабатывает - ты же говоришь Edit, а триггер сидит на Insert. А вообще, Davojan прав. Если нужен уникальный ID, то пусть сама БД это и делает. Сделай в этом триггере вызов SEQUENCE. Что-то вроде:
SELECT SEQUENCE.NEXTVAL INTO KOL FROM DUAL;
:NEW.ID_MODEL := KOL;
и при Insert указывай только NAME_MODEL.



DMaznich   (2002-01-03 13:07) [11]

BDE совершенно не причем. насколько знаю Oracle не закрытые транзакции не будут видны.
И зачем следующие строки:

DataModule2.QueryStanki.Edit;
DataModule2.QueryStanki.Post;



TAIS   (2002-01-03 13:07) [12]

Хорошо! Пусть криво! Но c компонентами NCOCI8 триггер работает без проблем (с этим же исходником!) Но мне надо знать почему не работает через BDE?



petr_v_a   (2002-01-03 13:31) [13]

дубль 2
посмотрите под SQL-монитором, что инсертится и когда



Yuvich   (2002-01-03 13:59) [14]

В студии не хватает UpdateSQL, который Insert; не хватает параметров DbOr: TDataBase.
Мне представляется такая штука: таблица и триггер принадлежат пользователю OGK, а клиент (DbOr) делает Insert и Post в таблицу, принадлежащую владельцу сессиии, т.е. другому пользователю, а у него такого триггера может не быть.

BEFORE INSERT ON OGK.OGK_MODEL , а в OGK.OGK_MODEL инсерта и не происходит.

Вообще, это плохая практика - явно указывать схему в триггере, -источник трудноуловимых ошибок. Схему указывать надо в "первичных операциях" (insert, update и т.д.)



TAIS   (2002-01-03 15:47) [15]

ууууу!!!
Insert делается в OGK.MODEL, где находится и триггер.
Через приложение прекрасно заносятся в базу дублирующиеся
записи. Я их вижу на сервере у user-a OGK!



Yuvich   (2002-01-03 15:55) [16]

Вот и ошибка: триггер на таблице OGK_MODEL, а инсерт идет в таблицу MODEL.



petr_v_a   (2002-01-03 16:10) [17]

ЗЫ
Do not define triggers that duplicate the functionality already built into Oracle Server...
Oracle 8i Application Development Guide - Fundamentals
По-моему процитировал правильно :)



TAIS   (2002-01-03 16:27) [18]

Для Yuvich: ошиблась, OGK_MODEL,а не MODEL.
Для petr_v_a : подключу Constraints (UNIQUE (NAME_MODEL)) и все!
Спасибо всем! И все-таки триггер не работает через BDE с ORACLE.
(И все-таки она вертится!..):(



petr_v_a   (2002-01-03 17:23) [19]

>TAIS Вот тут нарыл по ходу дела, вопрос очень просто решался, ь в init.ora установите параметр _enable_bde_triggers=true и все заработает!
С Новым Годом!!!

>Yuvich © Обсуждается интересный вопрос по Oracle http://delphi.mastak.com/cgi-bin/forum.pl?Look=1&id=1009453701&n=3



Davojan   (2002-01-04 12:48) [20]

petr_v_a ©
ну рассмешил :)))))))))))

СНГ!!




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.025 c
3-8804            Potemkin              2002-01-03 09:55  2002.02.04  
Вопрос


4-9042            Leviathan             2001-12-06 23:36  2002.02.04  
ScreenShot


1-8896            solsoft               2002-01-16 11:45  2002.02.04  
Формат заголовок архиватора IMP


1-8846            Dmitriy_R             2002-01-21 11:05  2002.02.04  
Как выяснить целое число и его остаток после какой нить математической операции?


3-8763            Pavel_s               2002-01-03 16:46  2002.02.04  
Интеграция Interbase и NT !!!!!!!!!!