Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / триггер на вставку, как запретить вставку записи не удовлетворяющей условию? / 15 сообщений из 15, страница 1 из 1
13.03.2007, 14:34
    #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
13.03.2007, 14:42
    #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
13.03.2007, 15:07
    #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
13.03.2007, 16:30
    #34387816
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
Victor MetelitsaКстати, ведь можно и просто FOREIGN KEY описать.Да, на самом деле достаточно FOREIGN KEY. Спасибо!
...
Рейтинг: 0 / 0
13.03.2007, 16:46
    #34387889
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
Всё же хочется до конца разобраться с триггером.
Выдаёт ошибку:
Код: plaintext
1.
SQL0206N  "VP.CODE_VP                                             
               " недопустимо в контексте, где оно используется.

Подозреваю, что дело в этом
Код: plaintext
1.
    -   Имя указывает на столбец рабочей таблицы, не используя        
        внутриоператорное имя OLD или NEW.  
...
Рейтинг: 0 / 0
13.03.2007, 17:16
    #34388038
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
To Viktor:
А ссылку не дадите по поводу подобного использования view?
...
Рейтинг: 0 / 0
14.03.2007, 08:02
    #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
14.03.2007, 08:14
    #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
14.03.2007, 09:12
    #34389149
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
To Victor:
Просто по терминам уточню... "Мутирует" - это значит изменяет свою структуру?
...
Рейтинг: 0 / 0
14.03.2007, 10:06
    #34389304
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
Только содержимое ;-)
...
Рейтинг: 0 / 0
14.03.2007, 10:10
    #34389318
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
To Victor:
Тогда если честно не понял, что за порблемы такие связанная с "мутацией"....:(
Это как раз из разряда целостности и ограничений?
...
Рейтинг: 0 / 0
14.03.2007, 10:19
    #34389348
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
Большое спасибо, с триггером тоже всё получилось. Работает естественно совершенно идентично FOREIGN KEY, но выглядит более приятно за счёт того, что можно задать своё сообщение об ошибке :)
...
Рейтинг: 0 / 0
14.03.2007, 11:16
    #34389586
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
Мысли вслух....
С внешним ключом БД на мой взгляд работает быстрее, чем с триггером....
...
Рейтинг: 0 / 0
14.03.2007, 11:40
    #34389688
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
В триггере такой-то таблицы пытаетесь обратиться к самой таблице - получаете ошибку "таблица мутирует". Обычное дело для Oracle, но при некоторых обстоятельствах можно получить аналогичное и на DB2. Триггер на VIEW позволяет обратиться до того, как таблица реально изменилась.
...
Рейтинг: 0 / 0
14.03.2007, 13:44
    #34390142
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер на вставку, как запретить вставку записи не удовлетворяющей условию?
TORTМысли вслух....
С внешним ключом БД на мой взгляд работает быстрее, чем с триггером....Да, я тоже об этом подумал. Во всяком случае должно быть так.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / триггер на вставку, как запретить вставку записи не удовлетворяющей условию? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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