Форум: "Базы";
Текущий архив: 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 ©
ну рассмешил :)))))))))))
СНГ!!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c