powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / CHECK constraint
18 сообщений из 43, страница 2 из 2
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
18 сообщений из 43, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / CHECK constraint
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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