Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 создание тригера на вставку с автоинкрементов  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 669
Есть в базе последовательность и триггер ее использующий. На вкладке Script из готового тригера и последовательности я скопировала

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".

но не пойму ... где при создании тригера идет упоминание использования последовательности ?
25 июл 19, 14:39    [21934408]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
Guzya
Member

Откуда:
Сообщений: 356
Вы базу с MS SQL на DB2 переносите?
25 июл 19, 14:52    [21934429]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 669
Guzya
Вы базу с MS SQL на DB2 переносите?

нет - просто хочу сделать поле id автоинкрементным. Чтобы при вставке данных в таблицу поле id принимало значение из сиквенса
25 июл 19, 15:47    [21934546]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
Guzya
Member

Откуда:
Сообщений: 356
Это делается изменением типа столбца. Т.е. alter table db.My_table alter column ...
Если db2 до 10 версии, то можно ч\з центр управления, правой кнопкой по таблице -> редактировать ->...

Какая версия db2 и какая ОС?
25 июл 19, 16:46    [21934602]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
maxkmn
Member

Откуда:
Сообщений: 10
Ольга Семенова,


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;

/
25 июл 19, 16:53    [21934606]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
maxkmn
Member

Откуда:
Сообщений: 10
p.s. можно и безусловно присваивать значение полю ID
25 июл 19, 16:54    [21934608]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
maxkmn
Member

Откуда:
Сообщений: 10
maxkmn,

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

vi crt.db2

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
25 июл 19, 17:15    [21934631]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 669
всем спасибо!!!
25 июл 19, 17:40    [21934650]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
CawaSPb
Member

Откуда: Питер/Москва/Wroclaw
Сообщений: 999
maxkmn
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@


begin atomic
 ...
end

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

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

В частности note к описанию Compound SQL (compiled) statement:

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 Автоинкремент, конечно, проще сделать так:
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() для суррогатных ключей, уж если они нужны.
25 июл 19, 19:26    [21934747]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
CawaSPb
Member

Откуда: Питер/Москва/Wroclaw
Сообщений: 999
PPS Историческая справка.

Non-atomic (compiled) триггеры и функции появились, дай бог памяти, в 9.7 как фича (расширило спектр возможных операций внутри триггеров/ф-й), но из-за недостаточного освещения аспекта реализации и производительности стало возможным делать такие вот "ошибки".
25 июл 19, 19:47    [21934773]     Ответить | Цитировать Сообщить модератору
 Re: создание тригера на вставку с автоинкрементов  [new]
ianolsen
Member

Откуда:
Сообщений: 1
vi crt.db2

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
spanish dictionary
6 авг 19, 06:38    [21942570]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить