powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / создание тригера на вставку с автоинкрементов
10 сообщений из 10, страница 1 из 1
создание тригера на вставку с автоинкрементов
    #39841424
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть в базе последовательность и триггер ее использующий. На вкладке Script из готового тригера и последовательности я скопировала

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE SEQUENCE db.My_SEQ
  AS INTEGER;

CREATE OR REPLACE TRIGGER db.My_Trigger
  NO CASCADE BEFORE INSERT
  ON db.My_table
  REFERENCING 
    NEW AS NEW
  FOR EACH ROW;



Lookup Error - DB2 Database Error: ERROR [42601] [IBM][DB2/NT64] SQL0104N An unexpected token "ROW" was found following "W AS NEW
FOR EACH". Expected tokens may include: "END-OF-STATEMENT".

но не пойму ... где при создании тригера идет упоминание использования последовательности ?
...
Рейтинг: 0 / 0
создание тригера на вставку с автоинкрементов
    #39841436
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы базу с MS SQL на DB2 переносите?
...
Рейтинг: 0 / 0
создание тригера на вставку с автоинкрементов
    #39841478
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GuzyaВы базу с MS SQL на DB2 переносите?
нет - просто хочу сделать поле id автоинкрементным. Чтобы при вставке данных в таблицу поле id принимало значение из сиквенса
...
Рейтинг: 0 / 0
создание тригера на вставку с автоинкрементов
    #39841514
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это делается изменением типа столбца. Т.е. alter table db.My_table alter column ...
Если db2 до 10 версии, то можно ч\з центр управления, правой кнопкой по таблице -> редактировать ->...

Какая версия db2 и какая ОС?
...
Рейтинг: 0 / 0
создание тригера на вставку с автоинкрементов
    #39841518
maxkmn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ольга Семенова,


CREATE OR REPLACE TRIGGER db.My_Trigger
NO CASCADE BEFORE INSERT
ON db.My_table
REFERENCING
NEW AS NEW
FOR EACH ROW
-- declare (if needed)
BEGIN
IF :NEW.ID IS NULL THEN
SELECT My_SEQ.Nextval INTO :NEW.ID FROM dual;
END IF;
END;

/
...
Рейтинг: 0 / 0
создание тригера на вставку с автоинкрементов
    #39841520
maxkmn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p.s. можно и безусловно присваивать значение полю ID
...
Рейтинг: 0 / 0
создание тригера на вставку с автоинкрементов
    #39841537
maxkmn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxkmn,

лучше, конечно, так (если совместимость с оракл не включена)

vi crt.db2

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace trigger my_trigger
no cascade before insert on my_table
referencing new as new for each row
begin
--if new.id is null then
select my_seq.nextval into new.id from sysibm.sysdummy1;
--end if;
end@



db2 -td@ -vf crt.db2
...
Рейтинг: 0 / 0
создание тригера на вставку с автоинкрементов
    #39841547
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем спасибо!!!
...
Рейтинг: 0 / 0
создание тригера на вставку с автоинкрементов
    #39841606
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxkmn
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace trigger my_trigger
no cascade before insert on my_table
referencing new as new for each row
begin
--if new.id is null then
select my_seq.nextval into new.id from sysibm.sysdummy1;
--end if;
end@



Код: sql
1.
2.
3.
begin atomic
 ...
end


будет значительно правильней.

Посмотрите, чем отличается Inlined Compound SQL от Compiled:
Compound SQL (inlined) statement
Compound SQL (compiled) statement

В частности note к описанию Compound SQL (compiled) statement:
Код: plaintext
1.
2.
If the ATOMIC keyword is specified in a dynamically prepared compound statement or an SQL function that is not within a module, 
the compound statement is processed as a compound SQL (inlined) statement.


Они отличаются не только поведением с точки зрения транзакционности (атомарности), но и механизмами реализации.

Inlined интегрируется в "родительский" SQL statement и выполняется SQL движком в рамках единого execution plan.

Compiled выполняется в некой Procedure Virtual Machine (PVM) - отдельный движок, интегрированный в СУБД для выполнения процедурного кода (SQL PL).

Соответственно Inlined Compound SQL имеет массу ограничений по сравнению с Compiled, но на порядки быстрее.
Не говоря уж про то, что помимо собственно выполнения кода будут значительные накладные расходы на вызов PVM.

Стоит также отметить, что при массированной вставке (массовая загрузка или нагруженное OLTP приложение) Compiled триггер, да ещё ON EACH ROW станет просто кошмаром.


BTW Автоинкремент, конечно, проще сделать так:
Код: sql
1.
2.
3.
ALTER TABLE db.My_table
  ALTER COLUMN id 
    SET  GENERATED BY DEFAULT  AS IDENTITY;



Можно ещё задать START WITH ..., INCREMENT BY ..., MIN/MAX values, CYCLE/NO CYCLE, размер кэша сгенерированных значений (чтобы лишний раз значение счётчика на диск не сбрасывать при высокой нагрузке).

"Внутри" оно, конечно, имплементировано через "сиситемные" sequences.


PS Лично я за использование GENERATE_UNIQUE() для суррогатных ключей, уж если они нужны.
...
Рейтинг: 0 / 0
создание тригера на вставку с автоинкрементов
    #39841621
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPS Историческая справка.

Non-atomic (compiled) триггеры и функции появились, дай бог памяти, в 9.7 как фича (расширило спектр возможных операций внутри триггеров/ф-й), но из-за недостаточного освещения аспекта реализации и производительности стало возможным делать такие вот "ошибки".
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / создание тригера на вставку с автоинкрементов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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