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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Create view АссортВсе as
SELECT 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Наимен, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Стар, 
  [ГлобSQL].dbo.АссортКонф.Цена, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Назначение, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.ПРименяемость
FROM [Глоб-ПоизводствоSQL].dbo.Ассортимент LEFT JOIN [ГлобSQL].dbo.АссортКонф ON [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел = [ГлобSQL].dbo.АссортКонф.КодИздел
Group by 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Наимен, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Стар, 
  [ГлобSQL].dbo.АссортКонф.Цена, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Назначение, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.ПРименяемость



Для него пишу триггер на изменение:

Код: 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.
ALTER TRIGGER [dbo].[InsteadUpdateTriggerАссортВсе] 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 [Глоб-ПоизводствоSQL].dbo.Ассортимент  set 
		 Наимен = (Select Наимен from inserted where КодИздел = @Id),
		 Стар = (Select Стар from inserted where КодИздел = @Id),
		 Назначение = (Select Назначение from inserted where КодИздел = @Id),
		 Применяемость = (Select ПРименяемость from inserted where КодИздел = @Id) where КодИздел = @Id
		
		Update [ГлобSQL].dbo.АссортКонф set цена = (Select Цена
	   from inserted where КодИздел = @Id) where КодИздел = @Id
		
		
	   fetch next from Cur into @Id
	 end;
   CLOSE Cur
   DEALLOCATE Cur
  

END;



триггер на изменение создан корректно, теперь при попытке изменить какую либо строку выдается сообщение:
the row value(s) updated or deleted either do not make the row unique or they alter multiple rows

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

Осознайте, что inserted и deleted - это таблицы, и общаться с ними надо как с таблицами, через join'ы.
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39601928
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

говорит что не понимает ваших приколов со сгруппированным предаставлением

https://msdn.microsoft.com/en-us/library/ms180800(v=sql.105).aspx
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39601938
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Я поэтому и пытаюсь триггер типа Instead of Update, т.к. стандартный функционал представления и не понимает как работать с представлениями из нескольких таблиц.
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39601939
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voltTaPaK,

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

Во-первых, добаваьте к представление опцию metadata
Во-вторых, set nocount on в начало триггера.
В-третьих, мало того, что курсор, так еще и inserted сканируется шесть раз вместо одного...
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39601963
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmvoltПодскажите, что я не так делаю?Если честно, то все.

Во-первых, добаваьте к представление опцию metadata
Во-вторых, set nocount on в начало триггера.
В-третьих, мало того, что курсор, так еще и inserted сканируется шесть раз вместо одного... VIEW_METADATA
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39601966
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

у вас в тригере везде КодИздел = @Id
уверены, что inserted возвращает уникальные КодИздел (с учётом того, что во вьюхе у вас left join по нему)
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39601971
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушкаvolt,

у вас в тригере везде КодИздел = @Id
уверены, что inserted возвращает уникальные КодИздел (с учётом того, что во вьюхе у вас left join по нему)
и что что есть left join?

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

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

Как проверить, что содержится в inserted?

Через exist, типа
Код: sql
1.
2.
3.
4.
update table 
set --bla bla
from iserted i
where i.id = table.id


типо того.
Также добавить if @@rowcount = 0 return.
Также сделать проверку через функцию Update на нужные столбцы.
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602775
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksrov,

автор if @@rowcount = 0 return.
MERGE смеётся над этим условием
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602777
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какого я exist написал... О другом видимо подумал.
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602778
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

ok, если совсем быть пуристом
Код: sql
1.
2.
if not exists (select * from inserted)
return
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602805
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Убрал группировку, из представления, все равно не дает модифицировать
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602807
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voltTaPaK,

Убрал группировку, из представления, все равно не дает модифицировать
и поставили DISTINCT?
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602838
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

в данный момент представление выглядит следующим образом:
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT 
                         [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел, [Глоб-ПоизводствоSQL].dbo.Ассортимент.Наимен, [Глоб-ПоизводствоSQL].dbo.Ассортимент.Стар, 
                         ГлобSQL.dbo.АссортКонф.Цена, [Глоб-ПоизводствоSQL].dbo.Ассортимент.Назначение, [Глоб-ПоизводствоSQL].dbo.Ассортимент.ПРименяемость
FROM            [Глоб-ПоизводствоSQL].dbo.Ассортимент LEFT OUTER JOIN
                         ГлобSQL.dbo.АссортКонф ON [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел = ГлобSQL.dbo.АссортКонф.КодИздел
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602844
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKvoltTaPaK,

Убрал группировку, из представления, все равно не дает модифицировать
и поставили DISTINCT?
пойду в лотерею играть
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602902
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Не работает не с дистинктом, ни без него...

Код: sql
1.
2.
3.
4.
SELECT        [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел, [Глоб-ПоизводствоSQL].dbo.Ассортимент.Наимен, [Глоб-ПоизводствоSQL].dbo.Ассортимент.Стар, 
                         ГлобSQL.dbo.АссортКонф.Цена, [Глоб-ПоизводствоSQL].dbo.Ассортимент.Назначение, [Глоб-ПоизводствоSQL].dbo.Ассортимент.ПРименяемость
FROM            [Глоб-ПоизводствоSQL].dbo.Ассортимент LEFT OUTER JOIN
                         ГлобSQL.dbo.АссортКонф ON [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел = ГлобSQL.dbo.АссортКонф.КодИздел
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602910
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,
а давайте начнем с чтения Документации
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602926
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

вы это с дизайнера что-ли делаете? :)
...
Рейтинг: 0 / 0
Триггер Instead Of Update
    #39602955
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Нет, это просто результат работы. Я создаю представление следующим образом:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Create view АссортВсе2 with view_metadata as
SELECT 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Наимен, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Стар, 
  [ГлобSQL].dbo.АссортКонф.Цена, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Назначение, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.ПРименяемость
FROM [Глоб-ПоизводствоSQL].dbo.Ассортимент LEFT JOIN [ГлобSQL].dbo.АссортКонф ON [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел = [ГлобSQL].dbo.АссортКонф.КодИздел



Затем создаю триггер:
Код: 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.
USE [ТехноSQL]
GO
/****** Object:  Trigger [dbo].[InsteadUpdateTriggerAssortimentPoln1]    Script Date: 12.02.2018 10:54:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON

go
Create TRIGGER [dbo].[InsteadUpdateTriggerАссортВсе2] on [dbo].[ассортВсе2]
INSTEAD OF Update
AS
BEGIN
  set nocount on
  declare @Id int
  declare Cur cursor for 
     Select КодИздел From inserted 
  open Cur

  fetch next from Cur into @Id

  while @@FETCH_STATUS = 0 
     begin
		Update [Глоб-ПоизводствоSQL].dbo.Ассортимент  set 
		 Наимен = (Select Наимен from inserted where КодИздел = @Id),
		 Стар = (Select Стар from inserted where КодИздел = @Id),
		 Назначение = (Select Назначение from inserted where КодИздел = @Id),
		 Применяемость = (Select ПРименяемость from inserted where КодИздел = @Id) where КодИздел = @Id
		
		Update [ГлобSQL].dbo.АссортКонф set цена = (Select Цена
	   from inserted where КодИздел = @Id) where КодИздел = @Id
			
	   fetch next from Cur into @Id
	 end;
   CLOSE Cur
   DEALLOCATE Cur
  END;



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

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

а курсор зачем?

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


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