powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Про комбинированный триггер
11 сообщений из 11, страница 1 из 1
Про комбинированный триггер
    #40097835
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, вот я сделал такой триггер

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TRIGGER Продажи_UPDATE_DELETE 
ON [dbo].[Продажи]
AFTER UPDATE, DELETE 
AS
BEGIN 

DECLARE @event_type CHAR(1)
IF EXISTS(SELECT * FROM inserted)
  SET @event_type = 'U'
ELSE
  SET @event_type = 'D'
....
END



При этом над исходной таблицей производиться полноценный MERGE, который содержит все три ветки: INSERT UPDATE DELETE.

Если он вставит 100 записей, обновить 50 записей, и удалит 10 записей, то сработает ли триггер один раз или два раза (один раз на UPDATE, другой на DELETE).

В общем как правильно получить тип операции по конкретной строке?
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097838
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Господа, вот я сделал такой триггер

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TRIGGER Продажи_UPDATE_DELETE 
ON [dbo].[Продажи]
AFTER UPDATE, DELETE 
AS
BEGIN 

DECLARE @event_type CHAR(1)
IF EXISTS(SELECT * FROM inserted)
  SET @event_type = 'U'
ELSE
  SET @event_type = 'D'
....
END



При этом над исходной таблицей производиться полноценный MERGE, который содержит все три ветки: INSERT UPDATE DELETE.

Если он вставит 100 записей, обновить 50 записей, и удалит 10 записей, то сработает ли триггер один раз или два раза (один раз на UPDATE, другой на DELETE).

В общем как правильно получить тип операции по конкретной строке?


"Правильно" - ориентироваться на содержимое таблиц inserted/deleted.
И не париться за "тип" операции.
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097842
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,


https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15

MERGE (Transact-SQL) Trigger implementation
For every insert, update, or delete action specified in the MERGE statement, SQL Server fires any corresponding AFTER triggers defined on the target table, but doesn't guarantee on which action to fire triggers first or last. Triggers defined for the same action honor the order you specify.
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097844
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, сделал я вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TRIGGER Продажи_UPDATE_DELETE 
ON [dbo].[Продажи]
AFTER UPDATE, DELETE 
AS
BEGIN 

INSERT INTO [dbo].[Продажи_History]
           (...
           ,[History_Date]
           ,[ChangeType])
	SELECT  ...
           ,GETDATE() AS [History_Date]
           ,IIF(i.ID IS NOT NULL, 'U', 'D') AS [ChangeType]
	FROM DELETED d
	LEFT JOIN INSERTED i ON d.Id = i.Id 
END 
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097845
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
В общем, сделал я вот так

главное, что бы id не апдейтился
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097848
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
a_voronin
В общем, сделал я вот так

главное, что бы id не апдейтился


Одна из вещей, который я хочу и проверить, -- не обновляется ли кем-то ID.
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097850
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
msLex
пропущено...

главное, что бы id не апдейтился


Одна из вещей, который я хочу и проверить, -- не обновляется ли кем-то ID.


Тогда "ON d.Id = i.Id" даст непредсказуемый результат.
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097851
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
a_voronin
пропущено...


Одна из вещей, который я хочу и проверить, -- не обновляется ли кем-то ID.


Тогда "ON d.Id = i.Id" даст непредсказуемый результат.


Вполне предсказуемый.

Останется DELETE запись истории и INSERT запись в основной таблице.
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097856
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
msLex
пропущено...


Тогда "ON d.Id = i.Id" даст непредсказуемый результат.


Вполне предсказуемый.

Останется DELETE запись истории и INSERT запись в основной таблице.


это если обновлять одну запись. А если несколько, например, со сдвигом id = id + 1
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097858
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
a_voronin
пропущено...


Вполне предсказуемый.

Останется DELETE запись истории и INSERT запись в основной таблице.


это если обновлять одну запись. А если несколько, например, со сдвигом id = id + 1


Это странная практика. Но в моем случае ID -- GUID
...
Рейтинг: 0 / 0
Про комбинированный триггер
    #40097859
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
msLex
пропущено...


это если обновлять одну запись. А если несколько, например, со сдвигом id = id + 1


Это странная практика. Но в моем случае ID -- GUID


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


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