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

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

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
28.04.2001, 10:45
    #32005002
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger insert и update - поменять значение для вставляемого поля
Уточню ответ Павла. SQL Server допускает использование рекусривных триггеров (простых). По умолчанию она отключена. Для включения нужно установить опцию Nested Triggers базы данных.
Даже с отключенной опцией Nested Triggers при выдачи команды Update изнутри триггера на Insert при выдачи команды Insert действительно запустятся оба триггера. Такая ситуация не считается рекурсивным запуском триггеров. Рекурсивным считается триггер, который приводит к запуску самого себя.
Если тебе нужно не допустить запуск триггера, если операция запущена из другого триггера, то выходов несколько.
1. Перейти на версию 2000 и использовать Instead-триггеры, которые как раз для таких ситуаций и предназначены (самое лучшее решение).
2. Если заведомо известен перечень всех источников подачи команды Update, и @@NestLevel при запуске триггера на Update при подачи команд от разных источников всегда разный, то можно в самом триггере предусмотреть ветвление по условию проверки переменной @@NestLevel.
3. Самый неизящный метод. Использовать вспомогательную таблицу, в которую помещается @@SPID (для того, чтобы разные сеансы друг другу не мешали) на время работы одного из триггеров. При выходе из триггера - удаляется. Внутри друго триггера можно проверить наличие соответствующей записи во вспомогательной таблице и определить, запущен данный триггер из первого триггера или из другого места.

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

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

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

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

Я обычно использую -
if not exists(select 1 from deleted)
...
Рейтинг: 0 / 0
08.05.2001, 09:59
    #32005297
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger insert и update - поменять значение для вставляемого поля
А вот что написано в 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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Trigger insert и update - поменять значение для вставляемого поля / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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