![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
триггер [D3, Oracle, ]
TAIS © (2002-01-02 09:47:00)Не работает триггер:
Приложение написано на DELPHI3, база- ORACLE8.1.5, связь через BDE. Почему при модификации данных через приложение не срабатывает триггер? А constraints срабатывают?
Davojan (2002-01-04 12:48:00) [1]petr_v_a ©
ну рассмешил :)))))))))))
СНГ!!
petr_v_a (2002-01-03 17:23:00) [2]>TAIS Вот тут нарыл по ходу дела, вопрос очень просто решался, ь в init.ora установите параметр _enable_bde_triggers=true и все заработает!
С Новым Годом!!!
>Yuvich © Обсуждается интересный вопрос по Oracle http://delphi.mastak.com/cgi-bin/forum.pl?Look=1&id=1009453701&n=3
TAIS (2002-01-03 16:27:00) [3]Для Yuvich: ошиблась, OGK_MODEL,а не MODEL.
Для petr_v_a : подключу Constraints (UNIQUE (NAME_MODEL)) и все!
Спасибо всем! И все-таки триггер не работает через BDE с ORACLE.
(И все-таки она вертится!..):(
petr_v_a (2002-01-03 16:10:00) [4]ЗЫ
Do not define triggers that duplicate the functionality already built into Oracle Server...
Oracle 8i Application Development Guide - Fundamentals
По-моему процитировал правильно :)
Yuvich (2002-01-03 15:55:00) [5]Вот и ошибка: триггер на таблице OGK_MODEL, а инсерт идет в таблицу MODEL.
TAIS (2002-01-03 15:47:00) [6]ууууу!!!
Insert делается в OGK.MODEL, где находится и триггер.
Через приложение прекрасно заносятся в базу дублирующиеся
записи. Я их вижу на сервере у user-a OGK!
Yuvich (2002-01-03 13:59:00) [7]В студии не хватает UpdateSQL, который Insert; не хватает параметров DbOr: TDataBase.
Мне представляется такая штука: таблица и триггер принадлежат пользователю OGK, а клиент (DbOr) делает Insert и Post в таблицу, принадлежащую владельцу сессиии, т.е. другому пользователю, а у него такого триггера может не быть.
BEFORE INSERT ON OGK.OGK_MODEL, а в OGK.OGK_MODEL инсерта и не происходит.
Вообще, это плохая практика - явно указывать схему в триггере, -источник трудноуловимых ошибок. Схему указывать надо в "первичных операциях" (insert, update и т.д.)
petr_v_a (2002-01-03 13:31:00) [8]дубль 2
посмотрите под SQL-монитором, что инсертится и когда
DMaznich (2002-01-03 13:07:00) [9]BDE совершенно не причем. насколько знаю Oracle не закрытые транзакции не будут видны.
И зачем следующие строки:
DataModule2.QueryStanki.Edit;
DataModule2.QueryStanki.Post;
TAIS (2002-01-03 13:07:00) [10]Хорошо! Пусть криво! Но c компонентами NCOCI8 триггер работает без проблем (с этим же исходником!) Но мне надо знать почему не работает через BDE?
keg (2002-01-03 12:05:00) [11]Вообще как-то криво все это сделано. Если делаешь Insert, то Edit уже делать не надо, а сразу делать Post. Кстати, может поэтому триггер и не срабатывает - ты же говоришь Edit, а триггер сидит на Insert. А вообще, Davojan прав. Если нужен уникальный ID, то пусть сама БД это и делает. Сделай в этом триггере вызов SEQUENCE. Что-то вроде:
SELECT SEQUENCE.NEXTVAL INTO KOL FROM DUAL;
:NEW.ID_MODEL := KOL;
и при Insert указывай только NAME_MODEL.
petr_v_a (2002-01-03 11:48:00) [12]И согласен с Davojan ©
Еще может быть, что insert-запрос реально не происходит при post/ApplyUpdates ( посмотрите под SQL-монитором, чтоинсертится и когда)
petr_v_a (2002-01-03 11:37:00) [13]еще select count(*)... не увидит незакоммиченные записи.
Насчет "А BDE(v 5.01) (Native драйвер ORACLE) поддерживает триггеры или только Constraints-ы?" - вопрос некорректный - триггеры,Constraints-ы и пр.пауки со змеями - механизмы сервера, а BDE(v 5.01) с Native драйвером - прослойка промеж приложением и API клиентскойчасти Oracle (OCI)
Davojan (2002-01-03 11:33:00) [14]Честно: в ORACLE, к сожалению, особо не разбираюсь, но разбираюсь в триггерах и клиент-серверной архитектуре вообще. В связи с этим скажу: здесь BDE не причём и быть виновным не может по той причине, что это клиентское ПО и может даже понятия не иметь о триггерах, а триггеры исполняются на стороне сервера независимо от того: хочет этого клиент или нет (если триггер, конечно, не выключен).
Интуиция мне подсказывает, что дело в обработчике кнопки. Но где точно ошибка сказать не могу, т.к. никогда не работал с кэшированными изменениями. Могу сказать что мне не нравится этот кусок:
DataModule2.QueryStanki.Edit;
DataModule2.QueryStanki.Post;
И ещё: насколько я понимаю эта строка:
MyQ.SQL.Add("SELECT ID_MODEL.nextval ID FROM EMPTY");
отвечает за уникальность ключа. Если так, то по-моему эту операцию как раз лучше производить с помощью триггера (сама концепция этого требует) или вообще можно создать хранимую процедуру, которая всё это дело будет осуществлять.
Удачи.
TAIS (2002-01-03 08:54:00) [15]Триггер-то через TOAD работает!
Хорошо, комментирую "when others then null"-результат тот же.
Через программу не работает!
А BDE(v 5.01) (Native драйвер ORACLE) поддерживает триггеры или только Constraints-ы? Разобраться в этом уже дело принципа.
petr_v_a (2002-01-02 17:59:00) [16]Навскидку скользко
when others then null - все другие ошибки подавлены, и триггер-то, возможно, срабатывает, возникает какая-то неприятность и тихо гаснет. Если нет, будем дальше разбираться
TAIS (2002-01-02 17:36:00) [17]Триггер на таблицу 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 16:10:00) [18]Тогда create table, текст триггера и запрос, при котором он не срабатывает - в студию
TAIS (2002-01-02 15:33:00) [19]Триггер не отключен. В TOAD срабатывает, а через приложение нет.
Desdechado (2002-01-02 10:46:00) [20]может, он отключен? или условие срабатывания не выполняется?
через приложение или с консоли - не играет роли.