Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Trigger insert и update - поменять значение для вставляемого поля
|
|||
|---|---|---|---|
|
#18+
Если в Trigger insert и update поменять значение для вставляемого или изменяемого поля можно только update **** поле=@pole из таблицы inserted. Т.е. получается, что при инсерте срабатывает еще триггер и на update. Это единственный способ? И как тогда отследить вставку null - значения в not null поле, если надо самому проверить и выдать сообщение. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2001, 19:12 |
|
||
|
Trigger insert и update - поменять значение для вставляемого поля
|
|||
|---|---|---|---|
|
#18+
По первому вопросу: триггер сработает только один раз. В этом легко убедиться: 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 лексики) и откатывайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2001, 06:51 |
|
||
|
Trigger insert и update - поменять значение для вставляемого поля
|
|||
|---|---|---|---|
|
#18+
Уточню ответ Павла. SQL Server допускает использование рекусривных триггеров (простых). По умолчанию она отключена. Для включения нужно установить опцию Nested Triggers базы данных. Даже с отключенной опцией Nested Triggers при выдачи команды Update изнутри триггера на Insert при выдачи команды Insert действительно запустятся оба триггера. Такая ситуация не считается рекурсивным запуском триггеров. Рекурсивным считается триггер, который приводит к запуску самого себя. Если тебе нужно не допустить запуск триггера, если операция запущена из другого триггера, то выходов несколько. 1. Перейти на версию 2000 и использовать Instead-триггеры, которые как раз для таких ситуаций и предназначены (самое лучшее решение). 2. Если заведомо известен перечень всех источников подачи команды Update, и @@NestLevel при запуске триггера на Update при подачи команд от разных источников всегда разный, то можно в самом триггере предусмотреть ветвление по условию проверки переменной @@NestLevel. 3. Самый неизящный метод. Использовать вспомогательную таблицу, в которую помещается @@SPID (для того, чтобы разные сеансы друг другу не мешали) на время работы одного из триггеров. При выходе из триггера - удаляется. Внутри друго триггера можно проверить наличие соответствующей записи во вспомогательной таблице и определить, запущен данный триггер из первого триггера или из другого места. Успехов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2001, 10:45 |
|
||
|
Trigger insert и update - поменять значение для вставляемого поля
|
|||
|---|---|---|---|
|
#18+
Блин, не до конца въехал в вопрос. К словам Garya могу только добавить примерчик как заставить не срабатывать триггер On Update при изменении поля в триггере On Insert Test_Insert - триггер на вставку Test_Update - На изменение В начале триггера Test_Update: If (Select Trigger_Nestlevel(Object_Id('Test_Insert'))) = 1 Return ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2001, 13:54 |
|
||
|
Trigger insert и update - поменять значение для вставляемого поля
|
|||
|---|---|---|---|
|
#18+
Есть еще такая фича, как IF UPDATE (column) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2001, 14:54 |
|
||
|
Trigger insert и update - поменять значение для вставляемого поля
|
|||
|---|---|---|---|
|
#18+
if (select count(*) from deleted)=0 тебе поможет. Табличка deleted существует при операции insert, но пустая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2001, 16:28 |
|
||
|
Trigger insert и update - поменять значение для вставляемого поля
|
|||
|---|---|---|---|
|
#18+
>if (select count(*) from deleted)=0 А вот такие конструкции использовать не рекомендуется! Для подобных проверок существует функция exists(), которая возвращает логический результат сразу, обнаружив только первую запись, не проходя по всем тысячам записям, которые могут оказаться в Deleted (или в другой таблице). Я бы эту фразу написал так: if not exists(select * from deleted) А для полноты картины - и звездочку ставить крайне не рекомендуется. Если в select указано только одно ключевое поле - работает еще быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2001, 22:25 |
|
||
|
Trigger insert и update - поменять значение для вставляемого поля
|
|||
|---|---|---|---|
|
#18+
2 Garya Я обычно использую - if not exists(select 1 from deleted) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2001, 09:37 |
|
||
|
Trigger insert и update - поменять значение для вставляемого поля
|
|||
|---|---|---|---|
|
#18+
А вот что написано в 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. Хотя я по скорости не замерял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2001, 09:59 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32005297&tid=1826847]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
25ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 261ms |
| total: | 370ms |

| 0 / 0 |
