powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Триггер Before Insert
8 сообщений из 8, страница 1 из 1
Триггер Before Insert
    #40106258
S_Gur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, подскажите, пожалуйста, могу я в триггере непосредственно присвоить значение конкретному полю? Или же триггера в SQLite используют исключительно SQL-запросы? Я сделал на After Insert запрос типа:

Update `tbTables` Set `tiOrderNumber` = (Select IfNull(Max(`tiOrderNumber`) + 1, 0) From `tbTables` Where `iDBID` = NEW.`iDBID`) Where `iID` = NEW.`iID`;

Это сработало. Но мне хочется сделать триггер Before Insert с конструкцией типа:

NEW.`tiOrderNumber` = (Select IfNull(Max(`tiOrderNumber`) + 1, 0) From `tbTables` Where `iDBID` = NEW.`iDBID`)

Можно ли сделать что-то подобное?
...
Рейтинг: 0 / 0
Триггер Before Insert
    #40106260
S_Gur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P. S. Похоже, тема закрыта. В теле триггера нельзя использовать ничего, кроме Select, Insert, Update или Delete...
...
Рейтинг: 0 / 0
Триггер Before Insert
    #40106296
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S_Gur
P. S. Похоже, тема закрыта. В теле триггера нельзя использовать ничего, кроме Select, Insert, Update или Delete...
Если точнее, то в триггере нельзя использовать ничего что отличается от обычного языка запросов.
В случае SQLite это значит что можно использовать только запросы понимаемые SQLite. В этой СУБД нет переменных, а значит и синтаксис работы с переменными - использовать нельзя.

S_Gur
Но мне хочется сделать триггер Before Insert с конструкцией типа:

Хочется - сделай. Просто помни что NEW и OLD это таблицы.
Код: sql
1.
update NEW set `tiOrderNumber` = (Select IfNull(Max(`tiOrderNumber`) + 1, 0) From `tbTables` Where `iDBID` = NEW.`iDBID`)
...
Рейтинг: 0 / 0
Триггер Before Insert
    #40106352
S_Gur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, спасибо большое. Не сообразил сразу. Это то, что нужно
...
Рейтинг: 0 / 0
Триггер Before Insert
    #40106531
S_Gur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, не работает ваш метод

"Insert Into`tbTables`(`iDBID`, `vcName`, `bTemporary`, `bZeroRecord`, `bLog`, `bUsers`, `bPrefix`, `bFldPrefixes`, `bIndPrefixes`, `txRemark`, `bIsDeletable`) Values(1, 'TriggerFieldLinks', 0, 1, 1, 0, 1, 1, 1, 'Связки триггеров с полями', 0) Returning iID; ..."
[System.Data.SQLite]
ErrorCode: 1
ErrorMessage: SQL logic error
no such table: main.NEW

Видимо, SQLite все-таки не считает таблицами OLD и NEW
...
Рейтинг: 0 / 0
Триггер Before Insert
    #40106668
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S_Gur
White Owl, не работает ваш метод
Странно, в документации нигде не вижу чтобы был запрет на обновление NEW, хотя в сети (на том же stackoverflow) есть сообщения что NEW нельзя обновлять...

Вообще, BEFORE триггеры использовать не рекомендуется (и это есть в документации). Потому что в случае работы с таблицей имеющей rowid (а это все-же большинство) в before new.rowid неизвестен. А вот в after триггере он уже установлен и можно легко изменить результат изменения .


В ASE, Oracle и SA обновлять таблицу NEW можно.

В MS SQL вообще нет BEFORE триггеров.
...
Рейтинг: 0 / 0
Триггер Before Insert
    #40106700
S_Gur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, в документации, насколько я помню, нет рекомендаций относительно нежелательности использования Before Insert. Там просто обращается внимание на отсутствие RowID, но в моей ситуации он не нужен. Жаль, конечно, что в данном случае придется обойтись без триггера, но, в общем, не смертельно. В Oracle, MySQL или MS SQL я их вообще не использую. Хватает хранимых процедур
...
Рейтинг: 0 / 0
Триггер Before Insert
    #40106712
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S_Gur
White Owl, в документации, насколько я помню, нет рекомендаций относительно нежелательности использования Before Insert.

В очень мягкой форме, но есть:
https://www.sqlite.org/lang_createtrigger.html#cautions_on_the_use_of_before_triggers
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Триггер Before Insert
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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