Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Про комбинированный триггер / 11 сообщений из 11, страница 1 из 1
15.09.2021, 16:26
    #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
15.09.2021, 16:30
    #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
15.09.2021, 16:34
    #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
15.09.2021, 16:41
    #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
15.09.2021, 16:43
    #40097845
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про комбинированный триггер
a_voronin
В общем, сделал я вот так

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

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


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

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


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


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


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


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


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

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


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


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

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


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


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

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


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


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


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


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


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


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