powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер Instead Of Update
9 сообщений из 9, страница 1 из 1
Триггер Instead Of Update
    #39637370
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Есть представление:

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
CREATE VIEW dbo.[Ком_НомДогПолнВалют] with view_metadata
AS 
   /*Generated by SQL Server Migration Assistant for Access version 7.8.0.*/
   SELECT 
      [НомДогОб].[СервУстр], 
      [НомДогОб].[ПРОчИнф], 
      [НомДогОб].[СрокИсполн], 
      [НомДогОб].[ТекстДог], 
      [НомДогОб].[ОргИсп], 
      [НомДогОб].[Исполнитель], 
      [НомДогОб].[Организация] AS [НомДогОб_Организация], 
      [НомДогОб].[КодДог], 
      [НомДогОб].[УслОтгр], 
      [НомДогОб].[Изм], 
      [НомДогОб].[Отец], 
      [НомДогОб].[ДатаИзм], 
      [НомДогОб].[Утв], 
      [НомДогОб].[НомДог], 
      [НомДогОб].[ДатаОплаты], 
      [НомДогОб].[ДатаПостДог], 
      [НомДогОб].[ДатаПостФакт], 
      [НомДогОб].[Примечание], 
      [НомДогОб].[ПроцОпл]
      [НомДогОб].[ОтДата], 
      [НомДогОб].[Метка], 
      [НомДогОб].[Примечание2], 
      [НомДогОб].[Примечание3], 
      [НомДогОб].[Примечание4], 
      [НомДогОб].[ДСП], 
      [НомДогОб].[Сложность], 
      [НомДогОб].[ДатаОтгрЖелат], 
      [НомДогОб].[ИзмТО], 
      [НомДогОб].[ИсполнительТО], 
      [НомДогОб].[СложнПНР], 
      [НомДогКонф].[Организация] AS [НомДогКонф_Организация], 
      [НомДогКонф].[СуммаДог], 
      [НомДогКонф].[АдресОтгрузки], 
      [НомДогКонф].[ОрганизацияНаим], 
      [НомДогКонф].[АдресОрг], 
      [НомДогКонф].[СуммаПрописью], 
      [НомДогКонф].[ПримечКонф], 
      [НомДогКонф].[АдрОтгрЦифр], 
      [НомДогОб].[Шапка], 
      [НомДогОб].[АналЗад], 
      [НодДогВалюта].[Валюта] AS Выражение1, 
      [НодДогВалюта].[КурсЦБ] AS Выражение2, 
      [НодДогВалюта].[КурсСКБ] AS Выражение3, 
      [НодДогВалюта].[НаДата] AS Выражение4
   FROM 
      ([НомДогКонф] 
         RIGHT JOIN [НомДогОб] 
         ON [НомДогКонф].[КодДог] = [НомДогОб].[КодДог]) 
         LEFT JOIN [НодДогВалюта] 
         ON [НомДогОб].[КодДог] = [НодДогВалюта].[КодДог]
   WHERE ((([НомДогОб].[Отец]) = 0))
GO



Необходимо написать триггер на обновление базовых таблиц.
Триггер я написал, но он не работает, зависает.

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create TRIGGER [dbo].[Update_Ком_НомДогПолнВалют] on [dbo].[Ком_НомДогПолнВалют]
INSTEAD OF Update
AS
BEGIN
  declare @Id int
  declare Cur cursor for 
     Select КодДог From inserted 
  open Cur

  fetch next from Cur into @Id

  while @@FETCH_STATUS = 0 
     begin
		Update dbo.[НомДогОб] set СервУстр = (Select СервУстр From inserted where КодДог = @id)
		update dbo.[НомДогОб] set [СервУстр] = (Select [СервУстр] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ПРОчИнф] = (Select [ПРОчИнф] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [СрокИсполн] = (Select [СрокИсполн] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ТекстДог] = (Select [ТекстДог] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ОргИсп] = (Select [ОргИсп] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Исполнитель] = (Select [Исполнитель] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Организация] = (Select [НомДогОб_Организация] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [УслОтгр] = (Select [УслОтгр] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Изм] = (Select [Изм] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Отец] = (Select [Отец] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ДатаИзм] = (Select [ДатаИзм] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Утв] = (Select [Утв] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [НомДог] = (Select [НомДог] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ДатаОплаты] = (Select [ДатаОплаты] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ДатаПостДог] = (Select [ДатаПостДог] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ДатаПостФакт] = (Select [ДатаПостФакт] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Примечание] = (Select [Примечание] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ПроцОпл] = (Select [ПроцОпл] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ОтДата] = (Select [ОтДата] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Метка] = (Select [Метка] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Примечание2] = (Select [Примечание2] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Примечание3] = (Select [Примечание3] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Примечание4] = (Select [Примечание4] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ДСП] = (Select [ДСП] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Сложность] = (Select [Сложность] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ДатаОтгрЖелат] = (Select [ДатаОтгрЖелат] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ИзмТО] = (Select [ИзмТО] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [ИсполнительТО] = (Select [ИсполнительТО] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [СложнПНР] = (Select [СложнПНР] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [Шапка] = (Select [Шапка] From Inserted where КодДог = @id)
		update dbo.[НомДогОб] set [АналЗад] = (Select [АналЗад] From Inserted where КодДог = @id)

		Update dbo.[НомДогКонф] set [Организация] = (Select  [НомДогКонф_Организация] From Inserted where КодДог = @id)
		Update dbo.[НомДогКонф] set [СуммаДог] = (Select [СуммаДог] From Inserted where КодДог = @id)
		Update dbo.[НомДогКонф] set [АдресОтгрузки] = (Select [АдресОтгрузки] From Inserted where КодДог = @id)
		Update dbo.[НомДогКонф] set [ОрганизацияНаим] = (Select [ОрганизацияНаим] From Inserted where КодДог = @id)
		Update dbo.[НомДогКонф] set [АдресОрг] = (Select [АдресОрг] From Inserted where КодДог = @id)
		Update dbo.[НомДогКонф] set [СуммаПрописью] = (Select [СуммаПрописью] From Inserted where КодДог = @id)
		Update dbo.[НомДогКонф] set [ПримечКонф] = (Select [ПримечКонф] From Inserted where КодДог = @id)
		Update dbo.[НомДогКонф] set [АдрОтгрЦифр] = (Select [АдрОтгрЦифр] From Inserted where КодДог = @id)

		Update dbo.[НомДогВалюта] set [Валюта] = (Select Выражение1 From Inserted where КодДог = @id)
		Update dbo.[НомДогВалюта] set [КурсЦБ] = (Select Выражение2 From Inserted where КодДог = @id)
		Update dbo.[НомДогВалюта] set [КурсСКБ]  = (Select Выражение3 From Inserted where КодДог = @id)
		Update dbo.[НомДогВалюта] set [НаДата]  = (Select Выражение4 From Inserted where КодДог = @id)



		
	   fetch next from Cur into @Id
	 end;
   CLOSE Cur
   DEALLOCATE Cur
  

END;



Подскажите, куда копать, в чем ошибка? Или как лучше сделать триггер.

Заранее спасибо.
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39637383
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

убрать нафиг курсор и сделать три апдейта (по одному на таблицу) вместо этой кучи

Код: sql
1.
[АналЗад]

вот это прямо очень хорошо характеризует примененный способ
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39637386
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,
ах, да.
обновлять желательно не все таблицы целиком, а только нужные строки.
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39637400
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель,

Я немного непонимаю, можно маленький пример
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39637408
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

Код: sql
1.
2.
3.
4.
5.
6.
7.
Update d
   set [СервУстр] = i.[СервУстр]
        ,[ПРОчИнф] = i.[ПРОчИнф]
  from inserted i
  join dbo.[НомДогОб] d
    on d.[КодДог] = i.[КодДог]
  



ну и тэ дэ
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39637411
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

@id уберите и курсор. И поля в один update напишите.
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39637443
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель,

Изменил триггер:

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
GO
/****** Object:  Trigger [dbo].[Update_Ком_НомДогПолнВалют]    Script Date: 27.04.2018 13:42:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Update_Ком_НомДогПолнВалют] on [dbo].[Ком_НомДогПолнВалют]
INSTEAD OF Update
AS
BEGIN
	Update d set
		[СервУстр] =  i.[СервУстр],
		[ПРОчИнф] =  i.[ПРОчИнф],
		[СрокИсполн] =  i.[СрокИсполн],
		[ТекстДог] =  i.[ТекстДог],
		[ОргИсп] =  i.[ОргИсп],
		[Исполнитель] =  i.[Исполнитель],
		[Организация] =  i.[НомДогОб_Организация],
		[УслОтгр] =  i.[УслОтгр],
		[Изм] =  i.[Изм],
		[Отец] =  i.[Отец],
		[ДатаИзм] =  i.[ДатаИзм],
		[Утв] =  i.[Утв],
		[НомДог] =  i.[НомДог],
		[ДатаОплаты] =  i.[ДатаОплаты],
		[ДатаПостДог] =  i.[ДатаПостДог],
		[ДатаПостФакт] =  i.[ДатаПостФакт],
		[Примечание] =  i.[Примечание],
		[ПроцОпл] =  i.[ПроцОпл],
		[ОтДата] =  i.[ОтДата],
		[Метка] =  i.[Метка],
		[Примечание2] =  i.[Примечание2],
		[Примечание3] =  i.[Примечание3],
		[Примечание4] =  i.[Примечание4],
		[ДСП] =  i.[ДСП],
		[Сложность] =  i.[Сложность],
		[ДатаОтгрЖелат] =  i.[ДатаОтгрЖелат],
		[ИзмТО] =  i.[ИзмТО],
		[ИсполнительТО] =  i.[ИсполнительТО],
		[СложнПНР] =  i.[СложнПНР],
		[Шапка] =  i.[Шапка],
		[АналЗад] =  i.[АналЗад]
	From inserted i join dbo.[НомДогОб] d on d.[КодДог] = i.[КодДог]

	Update d set
		[Организация] =  i. [НомДогКонф_Организация],
		[СуммаДог] =  i.[СуммаДог],
		[АдресОтгрузки] =  i.[АдресОтгрузки],
		[ОрганизацияНаим] =  i.[ОрганизацияНаим],
		[АдресОрг] =  i.[АдресОрг],
		[СуммаПрописью] =  i.[СуммаПрописью],
		[ПримечКонф] =  i.[ПримечКонф],
		[АдрОтгрЦифр] =  i.[АдрОтгрЦифр]
	From inserted i join dbo.[номДогКонф] d on d.[КодДог] = i.[КодДог]

	Update d set
		[Валюта] =  i.[Выражение1],
		[КурсЦБ] =  i.[Выражение2],
		[КурсСКБ]  =  i.[Выражение3],
		[НаДата]  =  i.[Выражение4]
	From inserted i join dbo.[НодДогВалюта] d on d.[КодДог] = i.[КодДог]
		
END;



В результате при попытке изменить значение поля выдается сообщение:
The data in row was not committed. The Row value(s) updated or deleted either do not make the row unique or they alter multiple rows (3 rows)
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39637459
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,
а при чем тут триггер?
это вы, похоже, пытаетесь в студии ручками поправить данные, а PK на таблице у вас отсутствует.
у вас и без триггера такая же ошибка будет
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39637472
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель,

Действительно. все корректно. спасибо большое.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер Instead Of Update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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