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


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