Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.004 c
1-8846
Dmitriy_R
2002-01-21 11:05
2002.02.04
Как выяснить целое число и его остаток после какой нить математической операции?


1-8920
Eraser
2002-01-17 13:39
2002.02.04
Название ComboBox


7-9009
Predator
2001-10-28 00:16
2002.02.04
ОС


14-8976
Nikolay
2001-12-12 20:27
2002.02.04
Откачали........


1-8871
Stror
2002-01-13 12:16
2002.02.04
WebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский