Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Trigger / 4 сообщений из 4, страница 1 из 1
04.04.2019, 09:18
    #39796132
yuri7811
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
Добрый Всем день.

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

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

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


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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
...
Рейтинг: 0 / 0
06.04.2019, 08:21
    #39797579
Deff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
yuri7811,

1. Вы можете сделать один триггер, а не два.
2. Вы можете использовать в триггере команду print 'название триггера '+convert(varchar, @@nestlevel), чтобы протестировать в Management Studio .
3. Вы можете почитать про рекурсивные триггеры.
...
Рейтинг: 0 / 0
06.04.2019, 13:34
    #39797628
monsenior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
yuri7811Добрый Всем день.

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

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

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


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 в котором вы модифицируете входящие данные и потом записываете в основную
и дополнительную таблицу

схема будет примерно такая
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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
...
Рейтинг: 0 / 0
12.04.2019, 16:20
    #39800654
yuri7811
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Trigger
Большое спасибо всем. разобрался.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Trigger / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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