powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
15 сообщений из 15, страница 1 из 1
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34387320
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно задать для таблицы следующее условие: значение вставляемое в поле VP.CODE_VP
должно содержаться в поле KBK таблицы SP_VP(которая собственно и создана для проверки допустимости вставляемых в таблицу VP значений).
Если это условие не выполняется, то данная запись не должна быть вставлена.
Для проверки решил создать триггер.
Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER DB2ADMIN.CHECK_KBK NO CASCADE BEFORE  INSERT  ON DB2ADMIN.VP  FOR EACH ROW  MODE DB2SQL 
WHEN ( VP.CODE_VP 
NOT IN (SELECT SP_VP.KBK FROM  SP_VP)
)
оператор-SQL-триггера ;
END;
Как должен выглядеть оператор запрещающий вставку записи не соответствующей условию?
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34387348
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIGNAL SQSTATE ...
http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/r0004232.htm
при этом выбрасывается исключение.

Если надо отвергать "тихо", можно сделать VIEW (чтобы вставлять в него) и на него повесить триггер INSTEAD, где и принимать решение о вставке в собственно таблицу.
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34387468
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
CREATE TRIGGER DB2ADMIN.CHECK_KBK NO CASCADE BEFORE  INSERT  ON DB2ADMIN.VP  FOR EACH ROW  MODE DB2SQL 
WHEN ( VP.CODE_VP NOT IN (SELECT SP_VP.KBK FROM  SP_VP) )
   SIGNAL SQLSTATE '75002'  SET MESSAGE_TEXT = 'XXXXXXXXXXXXXXXX';

Кстати, ведь можно и просто FOREIGN KEY описать.
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34387816
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaКстати, ведь можно и просто FOREIGN KEY описать.Да, на самом деле достаточно FOREIGN KEY. Спасибо!
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34387889
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё же хочется до конца разобраться с триггером.
Выдаёт ошибку:
Код: plaintext
1.
SQL0206N  "VP.CODE_VP                                             
               " недопустимо в контексте, где оно используется.

Подозреваю, что дело в этом
Код: plaintext
1.
    -   Имя указывает на столбец рабочей таблицы, не используя        
        внутриоператорное имя OLD или NEW.  
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34388038
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Viktor:
А ссылку не дадите по поводу подобного использования view?
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34389056
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XEugeneВсё же хочется до конца разобраться с триггером.
Выдаёт ошибку:
Код: plaintext
1.
SQL0206N  "VP.CODE_VP                                             
               " недопустимо в контексте, где оно используется.

Подозреваю, что дело в этом
Код: plaintext
1.
    -   Имя указывает на столбец рабочей таблицы, не используя        
        внутриоператорное имя OLD или NEW.  

Да, http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/r0000931.htm
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34389066
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TORTTo Viktor:
А ссылку не дадите по поводу подобного использования view?

Я такое видел в одной чужой системе на Oracle. Для каждой таблицы T они делали
CREATE VIEW VT AS SELECT * FROM T.
Из клиентских программ обращались только ко view, а не к таблицам. Понятно, что в общем случае таким view триггеры не нужны, поскольку они updateable. При нужде же для VT писались триггеры INSTEAD OF (UPDATE или DELETE или INSERT)

Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER VTU ... INSTEAD OF INSERT ON VT
...
IF условие THEN
  INSERT INTO T
...

Это широкоизвестный (для ораклистов) способ обхода проблем, связанных с тем, что таблица "мутирует". Для DB2 в принципе тоже может быть полезным.
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34389149
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Victor:
Просто по терминам уточню... "Мутирует" - это значит изменяет свою структуру?
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34389304
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только содержимое ;-)
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34389318
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Victor:
Тогда если честно не понял, что за порблемы такие связанная с "мутацией"....:(
Это как раз из разряда целостности и ограничений?
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34389348
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо, с триггером тоже всё получилось. Работает естественно совершенно идентично FOREIGN KEY, но выглядит более приятно за счёт того, что можно задать своё сообщение об ошибке :)
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34389586
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мысли вслух....
С внешним ключом БД на мой взгляд работает быстрее, чем с триггером....
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34389688
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В триггере такой-то таблицы пытаетесь обратиться к самой таблице - получаете ошибку "таблица мутирует". Обычное дело для Oracle, но при некоторых обстоятельствах можно получить аналогичное и на DB2. Триггер на VIEW позволяет обратиться до того, как таблица реально изменилась.
...
Рейтинг: 0 / 0
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
    #34390142
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TORTМысли вслух....
С внешним ключом БД на мой взгляд работает быстрее, чем с триггером....Да, я тоже об этом подумал. Во всяком случае должно быть так.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]