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

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

+
create view dbo.[ПП_покупныеВПланеОптимиз]
as

SELECT        dbo.ПланДог.МГ, dbo.НомДогОб.КодДог, dbo.ПланДог.НомПП, dbo.НомДогОб.ПроцОпл, dbo.СКЗпоДог.НомСКЗ, dbo.НомДогОб.НомДог, 
                         dbo.СКЗпоДог.Дог_СКЗ, dbo.СКЗпоДог.ДатаВПлан, dbo.ПланДог.ДатаОтгрЖелат, dbo.Ассортимент.КодИздел, dbo.Ассортимент.НаименПолн, 
                         dbo.Ассортимент.Наимен, dbo.План.Колво, dbo.Ассортимент.ТипИзд, dbo.ПокупнДоп1.Дата, dbo.ПокупнДоп1.ПРимечан, dbo.ПокупнДоп1.Выполнено, 
                         dbo.План.НомЗап
FROM            dbo.СКЗпоДог RIGHT OUTER JOIN
                         dbo.ПланДог ON dbo.СКЗпоДог.НомСКЗ = dbo.ПланДог.СКЗ LEFT OUTER JOIN
                         dbo.НомДогОб ON dbo.СКЗпоДог.КодДог = dbo.НомДогОб.КодДог LEFT OUTER JOIN
                         dbo.План LEFT OUTER JOIN
                         dbo.Ассортимент ON dbo.План.Изделие = dbo.Ассортимент.КодИздел LEFT OUTER JOIN
                         dbo.ПокупнДоп1 ON dbo.План.НомЗап = dbo.ПокупнДоп1.СвПлан ON dbo.ПланДог.НомПП = dbo.План.СвНомПП
WHERE        (dbo.ПланДог.МГ > 98) AND (dbo.Ассортимент.ТипИзд = 8 OR
                         dbo.Ассортимент.ТипИзд = 12 OR
                         dbo.Ассортимент.ТипИзд = 13 OR
                         dbo.Ассортимент.ТипИзд = 19 OR
                         dbo.Ассортимент.ТипИзд = 18 OR
                         dbo.Ассортимент.ТипИзд = 20 OR
                         dbo.Ассортимент.ТипИзд = 21) AND (dbo.ПланДог.ВидПлана = 1) OR
                         (dbo.Ассортимент.Наимен LIKE '*СЗТ углекислотой*')


Для данного представления написан триггер instead of update:
ALTER TRIGGER [dbo].[Update_ПП_ПокупныеВПланеОптимиз] on [dbo].[ПП_ПокупныеВПланеОптимиз]
INSTEAD OF Update
AS
BEGIN
	Update d set
		[Выполнено] = i.[Выполнено],
		[Дата] = i.[Дата],
		[ПРимечан] = i.[Примечан]
	From inserted i join dbo.[ПокупнДоп1] d on d.СвПлан = i.НомЗап where i.НомЗап in (select СвПлан from ПокупнДоп1)

	insert into [ПокупнДоп1] (СвПлан, Выполнено, Дата, ПРимечан) select НомЗап, Выполнено, Дата, примечан from inserted where
	   inserted.НомЗап not in (select СвПлан from ПокупнДоп1)

END;


при выполнении запроса: update ПП_ПокупныеВПланеОптимиз set Дата = '26.06.2018' where НомЗап= 1044
в сообщениях выдается следующее
(1 row(s) affected)

(1 row(s) affected)

Почему он модифицирует две строки, и какую он вторую строку модифицирует?

Заранее спасибо.
26 июн 18, 10:48    [21521057]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
Посетитель
Member

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

а ничего, что у вас две операции - update и insert
и каждая из них затрагивает указанное число строк :)
26 июн 18, 10:49    [21521067]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
volt
Member

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

Прошу прощения строк в сообщениях 3

(1 row(s) affected)

(0 row(s) affected)

(1 row(s) affected)
26 июн 18, 11:04    [21521152]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
TaPaK
Member

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

(1 row(s) affected) -- TR update

(0 row(s) affected) -- TR insert

(1 row(s) affected) -- CMD update ПП_ПокупныеВПланеОптимиз set Дата = '26.06.2018' where НомЗап= 1044

ну и
автор
on d.СвПлан = i.НомЗап where i.НомЗап in (select СвПлан from ПокупнДоп1)

Ты не пройдешь!
26 июн 18, 11:09    [21521193]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
volt
Member

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

Непонятно, почему не пройду??
26 июн 18, 11:26    [21521275]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
TaPaK
Member

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

Непонятно, почему не пройду??


так правильнее
on d.СвПлан = i.НомЗап where i.НомЗап in (select СвПлан from ПокупнДоп1) AND i.НомЗап  = d.СвПлан AND d.СвПлан IN (select НомЗап from ПокупнДоп1)
26 июн 18, 11:28    [21521288]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
Посетитель
Member

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

я так понимаю, это натягивание презерватива на свечку
26 июн 18, 11:28    [21521289]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
volt
Member

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

При попытке изменить запись в представлении через Access выдается ошибка: Конфликт записи.

В SQL Profiler появились следующие строки:

declare @p1 int
set @p1=7
exec sp_prepexec @p1 output,N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 int,@P10 int',N'SELECT "МГ","КодДог","НомПП","ПроцОпл","НомСКЗ","НомДог","Дог_СКЗ","ДатаВПлан","ДатаОтгрЖелат","КодИздел","НаименПолн","Наимен","Колво","ТипИзд","Дата","ПРимечан","Выполнено","НомЗап"  FROM "dbo"."ПП_ПокупныеВПланеОптимиз"  WHERE "НомЗап" = @P1 OR "НомЗап" = @P2 OR "НомЗап" = @P3 OR "НомЗап" = @P4 OR "НомЗап" = @P5 OR "НомЗап" = @P6 OR "НомЗап" = @P7 OR "НомЗап" = @P8 OR "НомЗап" = @P9 OR "НомЗап" = @P10',131430,92497,94162,67947,105147,88471,205141,134418,129521,138613
select @p1


exec sp_execute 7,46610,97967,110001,190772,116417,197156,221237,23579,161155,130305


exec sp_execute 7,162961,99304,118441,32001,100023,210649,210650,167062,137682,173981


exec sp_execute 7,134710,131433,97912,20198,52043,131431,193665,188785,206744,187249


declare @p1 int
set @p1=8
exec sp_prepexec @p1 output,N'@P1 int',N'SELECT "МГ","КодДог","НомПП","ПроцОпл","НомСКЗ","НомДог","Дог_СКЗ","ДатаВПлан","ДатаОтгрЖелат","КодИздел","НаименПолн","Наимен","Колво","ТипИзд","Дата","ПРимечан","Выполнено","НомЗап"  FROM "dbo"."ПП_ПокупныеВПланеОптимиз"  WHERE "НомЗап" = @P1',131430
select @p1


SELECT "dbo"."ПП_ПокупныеВПланеОптимиз"."НомЗап" FROM "dbo"."ПП_ПокупныеВПланеОптимиз" 


set implicit_transactions on SET TEXTSIZE 2147483647


exec sp_executesql N'UPDATE "dbo"."ПП_ПокупныеВПланеОптимиз" SET "Дата"=@P1  WHERE "НомЗап" = @P2 AND "МГ" = @P3 AND "КодДог" = @P4 AND "НомПП" = @P5 AND "ПроцОпл" = @P6 AND "НомСКЗ" = @P7 AND "НомДог" = @P8 AND "Дог_СКЗ" = @P9 AND "ДатаВПлан" = @P10 AND "ДатаОтгрЖелат" = @P11 AND "КодИздел" = @P12 AND "Наимен" = @P13 AND "Колво" = @P14 AND "ТипИзд" = @P15 AND "Дата" IS NULL AND "ПРимечан" = @P16 AND "Выполнено" = @P17',N'@P1 datetime,@P2 int,@P3 int,@P4 int,@P5 int,@P6 int,@P7 int,@P8 nvarchar(255),@P9 int,@P10 datetime,@P11 datetime,@P12 int,@P13 nvarchar(255),@P14 real,@P15 int,@P16 nvarchar(255),@P17 bit','2018-06-26 00:00:00',131430,165,64061,16130,100,24814,N'14-1240/1/ГК',1,'2014-07-07 00:00:00','2014-09-15 00:00:00',1,N'Аттест газ смесь (N2, O2, СО, CH4 в гелии) стальной баллон',1,12,N'Test',0


IF @@TRANCOUNT > 0 ROLLBACK TRAN


Подскажите, из-за чего конфликт записи?

К сообщению приложен файл. Размер - 96Kb
26 июн 18, 11:59    [21521467]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
TaPaK
Member

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

ну так отловили бы уже sql ошибку, что такое конфликт записи не понятно, pk скорее всего, но гадать бестолку
26 июн 18, 12:04    [21521489]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
volt
Member

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

В том то и дело, не могу отловить ошибку.. Похоже моих знаний не хватает.
26 июн 18, 12:46    [21521658]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
TaPaK
Member

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

В том то и дело, не могу отловить ошибку.. Похоже моих знаний не хватает.
\
в профайлере Alerts-Exception
26 июн 18, 12:49    [21521676]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
volt,

Коллега, у Вас Ms Access делает таки плохо, вот примерно так.
А все почему? Потому что работа с этим ПО - это балансирование на грани фола, постоянные дедлоки. Помните, Jet is not thread safe, поэтому update лучше напрямую, а не через view.
26 июн 18, 14:40    [21522187]     Ответить | Цитировать Сообщить модератору
 Re: Представление + Триггер Instead of update  [new]
invm
Member

Откуда: Москва
Сообщений: 9265
volt,

В триггере пропишите set nocount on
26 июн 18, 15:44    [21522505]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить