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

Код: 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
14.02.2018, 16:46
    #39601919
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
voltПодскажите, что я не так делаю?
Курсор в триггере, обожемой, какой верный способ убить производительность.

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

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

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

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

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

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

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

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

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

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

Как проверить, что содержится в inserted?
...
Рейтинг: 0 / 0
16.02.2018, 10:39
    #39602774
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
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
16.02.2018, 10:40
    #39602775
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
aleksrov,

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

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

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

Убрал группировку, из представления, все равно не дает модифицировать
и поставили DISTINCT?
...
Рейтинг: 0 / 0
16.02.2018, 11:42
    #39602838
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
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
16.02.2018, 11:47
    #39602844
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
TaPaKvoltTaPaK,

Убрал группировку, из представления, все равно не дает модифицировать
и поставили DISTINCT?
пойду в лотерею играть
...
Рейтинг: 0 / 0
16.02.2018, 13:01
    #39602902
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
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
16.02.2018, 13:09
    #39602910
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
volt,
а давайте начнем с чтения Документации
...
Рейтинг: 0 / 0
16.02.2018, 13:28
    #39602926
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
volt,

вы это с дизайнера что-ли делаете? :)
...
Рейтинг: 0 / 0
16.02.2018, 13:48
    #39602955
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
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
16.02.2018, 13:53
    #39602962
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Update
volt,

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

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

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


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