Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Trigger  [new]
yuri7811
Member

Откуда:
Сообщений: 16
Добрый Всем день.

Подскажите пожалуйста с задачей. Есть две таблицы . На первую приходят данные в формате (0,1,2,3,4,5). Эти данные пересылаются на вторую таблицу но формат немножко меняется (1,2,3,5,4,6) соответственно. Но в первой таблице он должен сохранятся в формате (20000,50000,40000,50000,30000, 70000) соответственно.
На первую таблицу поставил два триггера (after inert, update).

Вроде все работает как надо.

Вопрос: правильно ли такое решение и не будут ли триггеры каждый раз обрабатывать все строчки таблицы заново?


ALTER TRIGGER [dbo].[Conveyor_Main_Triger_TEST]
ON [dbo].[Events_Conveyor_Main]
AFTER INSERT AS
 BEGIN

  set nocount on

  UPDATE Events_Conveyor_Main  SET
        Events_Conveyor_Main.Code = case 
		when (b.Code  = 0)  Then 20000
		when (b.Code  = 1)  Then 50000
		when (b.Code  = 2)  Then 40000
		when (b.Code  = 3)  Then 50000
		when (b.Code  = 4)  Then 30000
		when (b.Code  = 5)  Then 70000
    	end
    from Events_Conveyor_Main a
    inner join  inserted b on b.ID_Station = a.ID_Station and b.DateTimeComplect = a.DateTimeComplect

end



ALTER TRIGGER [dbo].[Conveyor_Main_Triger]
    ON [dbo].[Events_Conveyor_Main]
    for update
    AS
    BEGIN

set nocount on

update a set
    a.Status_FromMachine_Auto = case
        when (b.code = 20000) then 1
        when (b.code = 50000) then 2
        when (b.code = 40000) then 3
	when (b.code = 60000) then 5
        when (b.code = 30000) then 4
	when (b.code = 70000) then 6
       
		 
    end
from        Station_Status  a
inner join  inserted b on b.ID_Station = a.Station_ID

end
4 апр 19, 09:18    [21852044]     Ответить | Цитировать Сообщить модератору
 Re: Trigger  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18323
yuri7811,

1. Вы можете сделать один триггер, а не два.
2. Вы можете использовать в триггере команду print 'название триггера '+convert(varchar, @@nestlevel), чтобы протестировать в Management Studio .
3. Вы можете почитать про рекурсивные триггеры.
6 апр 19, 08:21    [21854552]     Ответить | Цитировать Сообщить модератору
 Re: Trigger  [new]
monsenior
Member

Откуда:
Сообщений: 737
yuri7811
Добрый Всем день.

Подскажите пожалуйста с задачей. Есть две таблицы . На первую приходят данные в формате (0,1,2,3,4,5). Эти данные пересылаются на вторую таблицу но формат немножко меняется (1,2,3,5,4,6) соответственно. Но в первой таблице он должен сохранятся в формате (20000,50000,40000,50000,30000, 70000) соответственно.
На первую таблицу поставил два триггера (after inert, update).

Вроде все работает как надо.

Вопрос: правильно ли такое решение и не будут ли триггеры каждый раз обрабатывать все строчки таблицы заново?


ALTER TRIGGER [dbo].[Conveyor_Main_Triger_TEST]
ON [dbo].[Events_Conveyor_Main]
AFTER INSERT AS
 BEGIN

  set nocount on

  UPDATE Events_Conveyor_Main  SET
        Events_Conveyor_Main.Code = case 
		when (b.Code  = 0)  Then 20000
		when (b.Code  = 1)  Then 50000
		when (b.Code  = 2)  Then 40000
		when (b.Code  = 3)  Then 50000
		when (b.Code  = 4)  Then 30000
		when (b.Code  = 5)  Then 70000
    	end
    from Events_Conveyor_Main a
    inner join  inserted b on b.ID_Station = a.ID_Station and b.DateTimeComplect = a.DateTimeComplect

end



ALTER TRIGGER [dbo].[Conveyor_Main_Triger]
    ON [dbo].[Events_Conveyor_Main]
    for update
    AS
    BEGIN

set nocount on

update a set
    a.Status_FromMachine_Auto = case
        when (b.code = 20000) then 1
        when (b.code = 50000) then 2
        when (b.code = 40000) then 3
	when (b.code = 60000) then 5
        when (b.code = 30000) then 4
	when (b.code = 70000) then 6
       
		 
    end
from        Station_Status  a
inner join  inserted b on b.ID_Station = a.Station_ID

end


тут нужен один триггер INSTEAD OF в котором вы модифицируете входящие данные и потом записываете в основную
и дополнительную таблицу

схема будет примерно такая
ALTER TRIGGER [dbo].[Conveyor_Main_Triger_TEST]
ON [dbo].[Events_Conveyor_Main]
INSTEAD OF UPDATE
AS

UPDATE Events_Conveyor_Main  SET
        Events_Conveyor_Main.Code = case 
		when (b.Code  = 0)  Then 20000
		when (b.Code  = 1)  Then 50000
		when (b.Code  = 2)  Then 40000
		when (b.Code  = 3)  Then 50000
		when (b.Code  = 4)  Then 30000
		when (b.Code  = 5)  Then 70000
    	end
    from Events_Conveyor_Main a
    inner join  inserted b on b.ID_Station = a.ID_Station and b.DateTimeComplect = a.DateTimeComplect
       
update a set
    a.Status_FromMachine_Auto = case
        when (b.code = 20000) then 1
        when (b.code = 50000) then 2
        when (b.code = 40000) then 3
	when (b.code = 60000) then 5
        when (b.code = 30000) then 4
	when (b.code = 70000) then 6
       
		 
    end
from        Station_Status  a
inner join  inserted b on b.ID_Station = a.Station_ID

GO
6 апр 19, 13:34    [21854676]     Ответить | Цитировать Сообщить модератору
 Re: Trigger  [new]
yuri7811
Member

Откуда:
Сообщений: 16
Большое спасибо всем. разобрался.
12 апр 19, 16:20    [21860684]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить