powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / CHECK constraint
43 сообщений из 43, показаны все 2 страниц
CHECK constraint
    #39284146
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ткните меня, пожалуйста, в документацию, где описывается порядок проверки констрейнтов и срабатывания триггеров. Наткнулся на то, что CHECK отрабатывает раньше, чем триггер. Удивился.

Сервер IB XE3

С уважением, Vasilisk
...
Рейтинг: 0 / 0
CHECK constraint
    #39284151
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CHECK делается системным триггером. Срабатывает в порядке общей очереди.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CHECK constraint
    #39284157
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovCHECK делается системным триггеромЗнаю
Dimitry SibiryakovСрабатывает в порядке общей очереди.И эту очередь нельзя изменить?

Посмотрел RDB$TRIGGERS.RDB$TRIGGER_SEQUENCE. Для всех чеков стоит 0. И, как я понимаю, модификации не подлежит?
...
Рейтинг: 0 / 0
CHECK constraint
    #39284167
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_И эту очередь нельзя изменить?
Отрицательную позицию своим триггерам давать пробовал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CHECK constraint
    #39284171
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОтрицательную позицию своим триггерам давать пробовал?Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 29.
-.
...
Рейтинг: 0 / 0
CHECK constraint
    #39284174
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит не судьба. Возможно, триггера с одинаковыми позициями выполняются в алфавитном
порядке. Попробуй.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CHECK constraint
    #39284188
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВозможноЭто уже осознанное подкладывание себе граблей.

Спасибо за помощь.

В итоге изменил логику.
...
Рейтинг: 0 / 0
CHECK constraint
    #39284216
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову, ситуация вообще выглядит странной. Мало того, что все остальные констрейнты проверяются после триггеров, а чеки до, так еще и получается, что я в триггере могу нарушить чек-констрейнт для изначально валидных данных, и мне за это ничего не будет.
...
Рейтинг: 0 / 0
CHECK constraint
    #39284222
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считается, что триггера пишут не идиоты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CHECK constraint
    #39284254
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, как оно там в IB, но в FB вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
static blb* setup_triggers(thread_db* tdbb, jrd_rel* relation, bool null_view,
	trig_vec** triggers, blb* blob)
{
/**************************************
 *
 *	s e t u p _ t r i g g e r s
 *
 **************************************
 *
 * Functional description
 *
 *	Get the triggers in the right order, which appears
 *      to be system triggers first, then user triggers,
 *      then triggers that implement check constraints.
 *
 * BUG #8458: Check constraint triggers have to be loaded
 *	      (and hence executed) after the user-defined
 *	      triggers because user-defined triggers can modify
 *	      the values being inserted or updated so that
 *	      the end values stored in the database don't
 *	      fulfill the check constraint.
 *
 **************************************/

причём достаточно давно.

Вроде была какая-то возня вокруг этого во времена fb1 (?), но я не помню деталей

PS Запись про "BUG #8458" - это со времён IB, не наше. Т.е. по-идее, всё было правильно
...
Рейтинг: 0 / 0
CHECK constraint
    #39284388
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_что я в триггере могу нарушить чек-констрейнт для изначально валидных данных, и мне за это ничего не будет.

по идее поьзовательские триггера бывают BEFORE UPDATE и AFTER UPDATE

при этом AU изменить значение не может и вполне может вызываться после чеков

а вот BU может и по идее чеки должны делаться по результатам изменения значений BU-триггерами
...
Рейтинг: 0 / 0
CHECK constraint
    #39284653
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladНе знаю, как оно там в IB, но в FB вот так:Итак, результаты изысканий
DDL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SET SQL DIALECT 3;

CREATE TABLE TEST (
    NUM  INTEGER NOT NULL
);

/* Check constraints definition */

ALTER TABLE TEST ADD CHECK ("NUM" > 0);

SET TERM ^ ;


/* Trigger: TR_TEST_BI10 */
CREATE TRIGGER TR_TEST_BI10 FOR TEST
ACTIVE BEFORE INSERT POSITION 10
AS
BEGIN
  IF (NEW."NUM" < 0) THEN
    NEW."NUM" = -NEW."NUM";
END
^


SET TERM ; ^


Код: sql
1.
INSERT INTO test ("NUM") VALUES (-1);



Server Version: WI-V9.0.3.437 (IB 2009)
Server Implementation: InterBase/x86/Windows NT

Server Version: WI-V11.0.4.810 (IB XE3)
Server Implementation: InterBase/x64/Windows
Operation violates CHECK constraint on view or table
.
Operation violates CHECK constraint INTEG_2 on view or table TEST.

Server Version: WI-V2.5.1.26351 Firebird 2.5
Server Implementation: Firebird/x86/Windows NT1 record(s) was(were) inserted into TEST
Просто нет слов
...
Рейтинг: 0 / 0
CHECK constraint
    #39284662
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

а назначить этот триггер не BU а AU в интербейзе позволят ?
...
Рейтинг: 0 / 0
CHECK constraint
    #39284677
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа назначить этот триггер не BU а AU в интербейзе позволят ?Какой триггер? Вы о чем?
...
Рейтинг: 0 / 0
CHECK constraint
    #39284678
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

из вашего скрипта

сделать его after insert а не before

съест такое интербейз ?
...
Рейтинг: 0 / 0
CHECK constraint
    #39284680
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ты сегодня какую-то чепуху несёшь. BEFORE и AFTER триггеры они разные по смыслу. Ничего ты в AFTER триггере подправить уже не сможешь, следовательно констрейну это никак не поможет
...
Рейтинг: 0 / 0
CHECK constraint
    #39284687
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

молодец, возьми с полки пирожок (С)

но к самому впросу этот труизм ничего не добавляет, а вопрос был, позволяет ли именно IB создать такой триггер или нет
...
Рейтинг: 0 / 0
CHECK constraint
    #39284690
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа вопрос был, позволяет ли именно IB создать такой триггер или нетПозволяет. И какой в нем будет смысл? Модифицировать поля уже поздно
...
Рейтинг: 0 / 0
CHECK constraint
    #39284692
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochиз вашего скрипта
сделать его after insert а не before
съест такое интербейз ?Такое никто не съест. Нельзя в AFTER триггере модифицировать поля вставляемой записи
...
Рейтинг: 0 / 0
CHECK constraint
    #39284703
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

продолжайте платить за IB :)

PS не удержался, вырвалось
...
Рейтинг: 0 / 0
CHECK constraint
    #39284812
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Позволяет.
_Vasilisk_Такое никто не съест.

Плюрализм мнений в одной голове ?

После приведённого вам примера я от IB чего угодно могу ожидать

_Vasilisk_Нельзя в AFTER триггере модифицировать поля вставляемой записи

Сами записи м.б. и нет, а вот модифицировать переменные контекста - те самые NEW.xxxx - по моему ранние FB и до-FBшные IB позволяли
...
Рейтинг: 0 / 0
CHECK constraint
    #39284817
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ну значит не скопировали они это исправление из FB. ЕМНИП это правилось ещё в Firebird 1.0
...
Рейтинг: 0 / 0
CHECK constraint
    #39284826
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Пока не понятно Василиск не пробовал, а у мну IB нет

Вот-вот, я же помню что это было, хотя и правилось.
И если у них до сих пор чеки не вовремя вызываютсЯ, то может быть они вообще ничего в триггерах не правили.

Хотя, конечно, целая пака халявных переменных...
...
Рейтинг: 0 / 0
CHECK constraint
    #39284977
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochПлюрализм мнений в одной голове ?Вы внятно формулируйте свои желания
AriochПока не понятно Василиск не пробовалЧто я не пробовал? Я уже все написал
AriochСами записи м.б. и нет, а вот модифицировать переменные контекста - те самые NEW.xxxx - по моему ранние FB и до-FBшные IB позволялиКак раз выполнение INSERT/DELETE/UPDATE не запрешено нигде. А вот модифицировать контекст - только в BEFORE
...
Рейтинг: 0 / 0
CHECK constraint
    #39285153
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не пробовали 19487599

сделать ваш триггер

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
/* Trigger: TR_TEST_BI10 */
CREATE TRIGGER TR_TEST_BI10 FOR TEST
ACTIVE AFTER INSERT POSITION 10
AS
BEGIN
  IF (NEW."NUM" < 0) THEN
    NEW."NUM" = -NEW."NUM";
END
^




и посмотреть позволит ли это IB

_Vasilisk_модифицировать контекст - только в BEFORE

раньше это было не так, и судя по другому древнему багу в IB - этот тоже могли не исправить
...
Рейтинг: 0 / 0
CHECK constraint
    #39285418
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochи посмотреть позволит ли это IBСтроить логику системы на багах? Увольте!
Ariochне пробовалиИ не буду
...
Рейтинг: 0 / 0
CHECK constraint
    #39285423
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Строить логику системы на багах?

кто вам это предлагал? не додумывайте


_Vasilisk_И не буду

Жаль, может ещё у кого под руками свежий IB есть
...
Рейтинг: 0 / 0
CHECK constraint
    #39285482
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

у меня есть много свежих и несвежих ИБ. Но проверять не буду. Потому что, если правильно помню, это я рапортовал (возможно, с чьей-то подачи, а может и нет) про это поведение, которое исправили в ФБ 1 (см. коммент Влада). А вот рапортовал-ли я это в ИБ - не помню.
Впрочем, у меня на очереди лежат несколько мелких багрепортов в ИБ, может и это проверю, где-нибудь в середине августа (и отправлю).
...
Рейтинг: 0 / 0
CHECK constraint
    #39285495
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

самое интересное зачем оно тебя надо? Пользуешься IB?
...
Рейтинг: 0 / 0
CHECK constraint
    #39285541
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

пользовался бы - был бы IB в наличии - сам бы и проверил

любопытно же
...
Рейтинг: 0 / 0
CHECK constraint
    #39285571
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochлюбопытно же
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TRIGGER TR_TEST_AI10 FOR TEST
ACTIVE AFTER INSERT POSITION 10
AS
BEGIN
  NEW."NUM" = NEW."NUM" + 10;
END

Компилируется. Запрос
Код: sql
1.
INSERT INTO test ("NUM") VALUES (1);

вставляет в таблицу 1. IB 2009
...
Рейтинг: 0 / 0
CHECK constraint
    #39285575
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

значит в IB контекст NEW не делали readonly в AFTER триггерах.
...
Рейтинг: 0 / 0
CHECK constraint
    #39285591
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

спасибо.



Симонов Денис,

ну гипотетически могли поправить в XE3 - но вряд ли, раз они ВООБЩЕ триггеры не трогали, то почти наверняка не трогали вообще
...
Рейтинг: 0 / 0
CHECK constraint
    #39286689
hvladНе знаю, как оно там в IB, но в FB вот так:
Код: plaintext
1.
2.
3.
 *	Get the triggers in the right order, which appears
 *      to be system triggers first, then user triggers,
 *      then triggers that implement check constraints.

"system triggers first " - это те самые, что обеспечивают FK ?

Как-то не очень сильно бросилось в глаза, что они "first".
DDL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
recreate table tdetl(id int primary key using index tdetl_pk, pid int);
recreate table tmain(id int primary key using index tmain_pk);
alter table tdetl add constraint tdetl_fk foreign key (pid) references tmain(id) using index tdetl_fk;
set term ^;
execute block as
begin
  execute statement 'drop sequence g';
  when any do begin end
end
^
set term ;^
commit;

insert into tmain(id) values(1);
insert into tdetl(id, pid) values(1, 1);
commit;

create sequence g;
commit;
alter table tdetl add constraint tdetl_pid_gz check ( gen_id(g, -3 ) > 0 and pid>0 );
commit;

set term ^;
create or alter trigger tdetl_bi for tdetl active before insert as
  declare v int;
begin
  v = gen_id(g,0);
  v = gen_id(g, :v );
end
^
create or alter trigger tdetl_ai for tdetl active after insert as
  declare v int;
begin
  v = gen_id(g,123456);
end
^
set term ;^
commit;

set echo on;

alter sequence g restart with 5;
commit;
insert into tdetl(id, pid) values(2, -3);
rollback;
show sequence g;
commit;


alter sequence g restart with 5;
commit;
insert into tdetl(id, pid) values(2, 3);
rollback;
show sequence g;
commit;


Output:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
alter sequence g restart with 5;
commit;
insert into tdetl(id, pid) values(2, -3);
Statement failed, SQLSTATE = 23000
Operation violates CHECK constraint TDETL_PID_GZ on view or table TDETL
-At trigger 'CHECK_3'
After line 43 in file trg-queue.sql
rollback;
show sequence g;
Generator G, current value is 7
commit;

alter sequence g restart with 5;
commit;
insert into tdetl(id, pid) values(2, 3);
Statement failed, SQLSTATE = 23000
violation of FOREIGN KEY constraint "TDETL_FK" on table "TDETL"
-Foreign key reference target does not exist
-Problematic key value is ("PID" = 3)
After line 51 in file trg-queue.sql
rollback;
show sequence g;
Generator G,  current value is 7 
commit;

Т.е. во втором стейтменте, который пытается вставить корректное значение для check'a (pid > 0), но отсутствующее в master-таблице, мы видим ошибку о нарушении FK. Однако, значение генератора при этом такое же ( 7 ), как и в результате первого стейтмента, который обломался ввиду нарушения chek'a.

Это значит, что:
1) сначала отработал tdetl_bi (он удвоил начальное значение генератора и оно стало = 10),
2) затем check (он своим хитрым условием уменьшил значение генератора на 3 и оно стало = 7),
3) а затем уже принялся за работу system-триггер, проверяющий FK.

Итого получаем порядок срабатывания: user_defined trigger ==> check ==> system trigger.

Или я не прав ?
...
Рейтинг: 0 / 0
CHECK constraint
    #39286693
На всякий случай, вдруг кому понадобится: последовательность срабатывания триггеров на master & detail таблицах при каскадах.
...
Рейтинг: 0 / 0
CHECK constraint
    #39286713
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваня Сусанин"system triggers first " - это те самые, что обеспечивают FK ?Нет. Это те, которые созданы системой, но не для check constraints, у них RDB$SYSTEM_FLAG = 1.
Сейчас таких быть вообще не должно, может раньше были, не знаю.
check constraints, о которых речь, имеют типы 3, 4 и 5.

Полный список тут:
Код: sql
1.
2.
3.
SELECT RDB$TYPE RDB$TYPE_NAME 
  FROM RDB$TYPES 
 WHERE RDB$FIELD_NAME = 'RDB$SYSTEM_FLAG';



В твой поток бессознательного я не вникал, скажу лишь, что это
Ваня Сусанин1) сначала отработал tdetl_bi (он удвоил начальное значение генератора и оно стало = 10),
2) затем check (он своим хитрым условием уменьшил значение генератора на 3 и оно стало = 7),
3) а затем уже принялся за работу system-триггер, проверяющий FK.полностью соответствует комментарию в коде, который я приводил
...
Рейтинг: 0 / 0
CHECK constraint
    #39286972
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladВаня Сусанин"system triggers first " - это те самые, что обеспечивают FK ?Нет. Это те, которые созданы системой, но не для check constraints, у них RDB$SYSTEM_FLAG = 1.
Сейчас таких быть вообще не должно, может раньше были, не знаю.


в порядке бреда

тогда это м.б. были триггера для изменения БД прямыми модификациями системных таблиц? вот они и следили за этим.
...
Рейтинг: 0 / 0
CHECK constraint
    #39286977
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladполностью соответствует комментарию в коде, который я приводил

ну вроде не совсем

"then user triggers, then triggers that implement check constraints."
это если буквально читать означает (USER) BEFORE-xxx, (USER) AFTER-xxx, CHECK_xxx

а по факту идёт (USER) BEFORE-xxx, CHECK_xxx, (USER) AFTER-xxx
...
Рейтинг: 0 / 0
CHECK constraint
    #39287022
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochэто если буквально читать означает (USER) BEFORE-xxx, (USER) AFTER-xxx, CHECK_xxx

Это ты неправильно читаешь. Весь коммент относится исключительно к BEFORE триггерам, ибо
проверять что-то после вставки - странная идея.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CHECK constraint
    #39287035
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladсозданы системой, но не для check constraints, у них RDB$SYSTEM_FLAG = 1.
Сейчас таких быть вообще не должно, может раньше были, не знаю.Недосмотрел, их полно :)
Они не разрешают некоторые манипуляции с системным каталогом.
...
Рейтинг: 0 / 0
CHECK constraint
    #39287038
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAriochэто если буквально читать означает (USER) BEFORE-xxx, (USER) AFTER-xxx, CHECK_xxx

Это ты неправильно читаешь. Весь коммент относится исключительно к BEFORE триггерам, ибо
проверять что-то после вставки - странная идея.В комменте вообще не упоминаются BEFORE\AFTER события. Посему итоговый порядок таков

BEFORE SYSTEM (1)
BEFORE USER
BEFORE SYSTEM (3-5)
AFTER SYSTEM (1)
AFTER USER
AFTER SYSTEM (3-5)
...
Рейтинг: 0 / 0
CHECK constraint
    #39287045
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

т.е. сортировка "по двум столбцам", сначала по before/after и потом внутри каждого по system/user/check

IMHO было бы неплохо это вно в комментарий воткнуть при случае
...
Рейтинг: 0 / 0
CHECK constraint
    #39287048
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladВ комменте вообще не упоминаются BEFORE\AFTER события

и обычно это означает, что раз не указаны подмножества, то в ход идёт всё множества

комментарии то пишут, не для тех кто уже понял функцию, а для тех кто только начинает разбираться
не код функции поясняет комментарии, а наоборот....
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / CHECK constraint
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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