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

Откуда:
Сообщений: 105
Добрый день!
Есть представление:

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


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

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;


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

Заранее спасибо.
27 апр 18, 12:52    [21373569]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Update  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
volt,

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

+
[АналЗад]
вот это прямо очень хорошо характеризует примененный способ
27 апр 18, 12:58    [21373612]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Update  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
volt,
ах, да.
обновлять желательно не все таблицы целиком, а только нужные строки.
27 апр 18, 13:00    [21373628]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Update  [new]
volt
Member

Откуда:
Сообщений: 105
Посетитель,

Я немного непонимаю, можно маленький пример
27 апр 18, 13:07    [21373683]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Update  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
volt,

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


ну и тэ дэ
27 апр 18, 13:12    [21373717]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Update  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7401
volt,

@id уберите и курсор. И поля в один update напишите.
27 апр 18, 13:14    [21373723]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Update  [new]
volt
Member

Откуда:
Сообщений: 105
Посетитель,

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

+
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)
27 апр 18, 13:44    [21373907]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Update  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
volt,
а при чем тут триггер?
это вы, похоже, пытаетесь в студии ручками поправить данные, а PK на таблице у вас отсутствует.
у вас и без триггера такая же ошибка будет
27 апр 18, 13:57    [21373998]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Update  [new]
volt
Member

Откуда:
Сообщений: 105
Посетитель,

Действительно. все корректно. спасибо большое.
27 апр 18, 14:07    [21374064]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить