powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
10 сообщений из 10, страница 1 из 1
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37912528
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.
Натолкнулся на проблему, где не ждал:
в триггере [before insert] задаю значение столбца new.SomeColumn, и ожидаю, что именно оно и вставится в таблицу.
Как бы не так... Не модифицируется; что пришло в триггер, то и вставляется (в том же MS SQL Server - именно так срабатывает).

Исходный текст:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE [MyHistory] (
  [Id] INT NOT NULL, 
  [EventDT] DATETIME DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime')), 
  [Content] VARCHAR(200));

CREATE TRIGGER [trgHistBI]
BEFORE INSERT
ON [MyHistory]
FOR EACH ROW
BEGIN
  select new.Id = coalesce(max(Id), 0) + 1 
    from MyHistory;
END;

-- insert into MyHistory (Content) values('Тест'); -- не срабатывает совсем, ошибка 'MyHistory.Id may not be NULL.'
insert into MyHistory (Id, Content) values(1, 'Тест');
insert into MyHistory (Id, Content) values(1, 'Тест 2'); -- так и остается Id = 1


По статье http://www.sqlite.org/lang_createtrigger.html - все корректно. Но там нет ничего насчет оперирования OLD.* / NEW.*, только про корректность их употребления в текстах триггеров.
Где корень зла? Настройки БД? Специфика SQLite?
Подскажите, кто знает ответ.
...
Рейтинг: 0 / 0
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37912600
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_Gap,

нельзя менять значения
Код: sql
1.
new.* old.*

, в тригере формируйте insert с нужным значением
...
Рейтинг: 0 / 0
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37913007
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alex,
Наверно вы хотели сказать UPDATE...

Serg_Gap,
Допустимы только DML-операторы. Переменных нет ни в какой форме. Это не СУБД, а embedded - не забывайте!
...
Рейтинг: 0 / 0
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37913935
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pit_alexнельзя менять значения
Код: sql
1.
new.* old.*


Уже понял, но не понял, почему именно ("нельзя" - это слишком строго; можно, но без толку).
Немного объяснил RXL:
RXLЭто не СУБД, а embedded - не забывайте!
А так похоже на СУБД...
И странно... Это ведь разрешимо - сделать new.*, old.* изменяемыми. Жаль, что этого нет.
Конечно, выход найден: в триггере [AfterInsert] делать обновление (новая запись уже будет присутствовать в таблице), но это очень нелогично - делать запрос на обновление ТАБЛИЦЫ, когда можно обновить одну-единственную запись, явно присутствующую в триггере...
Спасибо RXL и pit_alex, что откликнулись. Ответ я получил.
...
Рейтинг: 0 / 0
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37945311
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_Gappit_alexнельзя менять значения
Код: sql
1.
new.* old.*


Уже понял, но не понял, почему именно ("нельзя" - это слишком строго; можно, но без толку).
Немного объяснил RXL:
RXLЭто не СУБД, а embedded - не забывайте!
А так похоже на СУБД...
И странно... Это ведь разрешимо - сделать new.*, old.* изменяемыми. Жаль, что этого нет.
Конечно, выход найден: в триггере [AfterInsert] делать обновление (новая запись уже будет присутствовать в таблице), но это очень нелогично - делать запрос на обновление ТАБЛИЦЫ, когда можно обновить одну-единственную запись, явно присутствующую в триггере...
Спасибо RXL и pit_alex, что откликнулись. Ответ я получил.

а где такое есть. чтобы можно было менять old.* и new.* ?
Есть триггеры before и after. там и меняйте... триггеров может быть несколько.
...
Рейтинг: 0 / 0
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37946073
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Winnipuhа где такое есть. чтобы можно было менять old.* и new.* ? 12995038 Serg_Gap(в том же MS SQL Server - именно так срабатывает
...
Рейтинг: 0 / 0
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37946080
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh
а где такое есть. чтобы можно было менять old.* и new.* ?
Есть триггеры before и after. там и меняйте... триггеров может быть несколько.

В Oracle можно подменять :new на строчном триггере без DML

if INSERTING or UPDATING then
:new.last_user := user;
end if;

:old подменять нельзя - (не понятно как и зачем) его можно только сохранить и использовать для проверок.
p.s.
зато в оракле нельзя делать DML к таблице на которой в текущей момент работает строчный триггер
возникает "мутация" ...
...
Рейтинг: 0 / 0
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37946163
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_GapWinnipuhа где такое есть. чтобы можно было менять old.* и new.* ? 12995038 Serg_Gap(в том же MS SQL Server - именно так срабатывает

странно вы ответили два ссылку на эту же тему.

Но так и не написали, какой сервер позволяет менять new.* значения в триггере?
...
Рейтинг: 0 / 0
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37946685
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Winnipuh:
это ссылка не на тему, а на сообщение, содержащее ответ на вопрос.
Процитировал отдельно, выделив цветом название сервера.
Если этого недостаточно, please: MS SQL Server (у меня 2005 / 2008, на разных серверах локалки, пользую оба).
(ЕМНИП, PG и FB - тоже позволяют задавать вставляемое значение в триггере BI, изменяя NEW.[SomeField])

PPA:old подменять нельзя - (не понятно как и зачем)Согласен; в запале включил в список.
...
Рейтинг: 0 / 0
Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
    #37946751
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати (или некстати - не по теме вопроса, но раз уж здесь встретились):
Winnipuh, не интересно?
Настоящие Кристофер Робин и Винни-Пух. Прототипы известных сказочных героев. 1926-28
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Вопрос к знатокам по заданию значений NEW.* в триггере [BEFORE INSERT]
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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