powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Trigger insert и update - поменять значение для вставляемого поля
9 сообщений из 9, страница 1 из 1
Trigger insert и update - поменять значение для вставляемого поля
    #32004979
Vitaly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если в Trigger insert и update поменять значение для вставляемого или изменяемого поля можно только
update **** поле=@pole из таблицы inserted. Т.е. получается, что при инсерте срабатывает еще триггер и на update. Это единственный способ?
И как тогда отследить вставку null - значения в not null поле, если надо самому проверить и выдать сообщение.

Спасибо
...
Рейтинг: 0 / 0
Trigger insert и update - поменять значение для вставляемого поля
    #32004994
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По первому вопросу: триггер сработает только один раз. В этом легко убедиться:

Create Table Test(id Int, cnt int)
go

Create Trigger Test_Update On dbo.Test For Update As
Update Test Set cnt = cnt + 1
go

Insert Into Test(id, cnt) Values(1,1)

Update Test Set id = 2

Select * From Test

cnt будет 2, а не 3

По второму вопросу: Просто разреши Null для этого поля, а в триггере на вставку и изменение проверяй что туда вколачивается, и если Is Null, то ругайся на понятном для юзеров языке (возможно даже с применением соответсвующей уровню их iq лексики) и откатывайся.
...
Рейтинг: 0 / 0
Trigger insert и update - поменять значение для вставляемого поля
    #32005002
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточню ответ Павла. SQL Server допускает использование рекусривных триггеров (простых). По умолчанию она отключена. Для включения нужно установить опцию Nested Triggers базы данных.
Даже с отключенной опцией Nested Triggers при выдачи команды Update изнутри триггера на Insert при выдачи команды Insert действительно запустятся оба триггера. Такая ситуация не считается рекурсивным запуском триггеров. Рекурсивным считается триггер, который приводит к запуску самого себя.
Если тебе нужно не допустить запуск триггера, если операция запущена из другого триггера, то выходов несколько.
1. Перейти на версию 2000 и использовать Instead-триггеры, которые как раз для таких ситуаций и предназначены (самое лучшее решение).
2. Если заведомо известен перечень всех источников подачи команды Update, и @@NestLevel при запуске триггера на Update при подачи команд от разных источников всегда разный, то можно в самом триггере предусмотреть ветвление по условию проверки переменной @@NestLevel.
3. Самый неизящный метод. Использовать вспомогательную таблицу, в которую помещается @@SPID (для того, чтобы разные сеансы друг другу не мешали) на время работы одного из триггеров. При выходе из триггера - удаляется. Внутри друго триггера можно проверить наличие соответствующей записи во вспомогательной таблице и определить, запущен данный триггер из первого триггера или из другого места.

Успехов
...
Рейтинг: 0 / 0
Trigger insert и update - поменять значение для вставляемого поля
    #32005012
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, не до конца въехал в вопрос. К словам Garya могу только добавить примерчик как заставить не срабатывать триггер On Update при изменении поля в триггере On Insert

Test_Insert - триггер на вставку
Test_Update - На изменение

В начале триггера Test_Update:

If (Select Trigger_Nestlevel(Object_Id('Test_Insert'))) = 1
Return
...
Рейтинг: 0 / 0
Trigger insert и update - поменять значение для вставляемого поля
    #32005013
Есть еще такая фича, как IF UPDATE (column)
...
Рейтинг: 0 / 0
Trigger insert и update - поменять значение для вставляемого поля
    #32005180
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
if (select count(*) from deleted)=0
тебе поможет. Табличка deleted существует при операции insert, но пустая.
...
Рейтинг: 0 / 0
Trigger insert и update - поменять значение для вставляемого поля
    #32005281
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>if (select count(*) from deleted)=0
А вот такие конструкции использовать не рекомендуется! Для подобных проверок существует функция exists(), которая возвращает логический результат сразу, обнаружив только первую запись, не проходя по всем тысячам записям, которые могут оказаться в Deleted (или в другой таблице). Я бы эту фразу написал так:
if not exists(select * from deleted)
А для полноты картины - и звездочку ставить крайне не рекомендуется. Если в select указано только одно ключевое поле - работает еще быстрее.
...
Рейтинг: 0 / 0
Trigger insert и update - поменять значение для вставляемого поля
    #32005293
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Garya

Я обычно использую -
if not exists(select 1 from deleted)
...
Рейтинг: 0 / 0
Trigger insert и update - поменять значение для вставляемого поля
    #32005297
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот что написано в BOL про EXISTS
When a subquery is introduced with the keyword EXISTS, it functions as an existence test. The WHERE clause of the outer query tests for the existence of rows returned by the subquery. The subquery does not actually produce any data; it returns a value of TRUE or FALSE.
...
The select list of a subquery introduced by EXISTS almost always consists of an asterisk (*). There is no reason to list column names because you are simply testing for the existence of rows that meet the conditions specified in the subquery.

Т.е. как я понял SQL на этот список и не смотрит, и всё равно что писать * или 1. Хотя я по скорости не замерял.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Trigger insert и update - поменять значение для вставляемого поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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