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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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)

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

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

а ничего, что у вас две операции - update и insert
и каждая из них затрагивает указанное число строк :)
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39665820
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель,

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

(1 row(s) affected)

(0 row(s) affected)

(1 row(s) affected)
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39665826
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
Ты не пройдешь!
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39665846
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Непонятно, почему не пройду??
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39665851
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voltTaPaK,

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

так правильнее
Код: sql
1.
on d.СвПлан = i.НомЗап where i.НомЗап in (select СвПлан from ПокупнДоп1) AND i.НомЗап  = d.СвПлан AND d.СвПлан IN (select НомЗап from ПокупнДоп1)
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39665852
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

я так понимаю, это натягивание презерватива на свечку
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39665891
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

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

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

Код: sql
1.
2.
3.
4.
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



Код: sql
1.
exec sp_execute 7,46610,97967,110001,190772,116417,197156,221237,23579,161155,130305



Код: sql
1.
exec sp_execute 7,162961,99304,118441,32001,100023,210649,210650,167062,137682,173981



Код: sql
1.
exec sp_execute 7,134710,131433,97912,20198,52043,131431,193665,188785,206744,187249



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



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



Код: sql
1.
set implicit_transactions on SET TEXTSIZE 2147483647



Код: sql
1.
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



Код: sql
1.
IF @@TRANCOUNT > 0 ROLLBACK TRAN



Подскажите, из-за чего конфликт записи?
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39665898
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

ну так отловили бы уже sql ошибку, что такое конфликт записи не понятно, pk скорее всего, но гадать бестолку
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39665940
volt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

В том то и дело, не могу отловить ошибку.. Похоже моих знаний не хватает.
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39665948
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voltTaPaK,

В том то и дело, не могу отловить ошибку.. Похоже моих знаний не хватает.\
в профайлере Alerts-Exception
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39666054
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

Коллега, у Вас Ms Access делает таки плохо, вот примерно так .
А все почему? Потому что работа с этим ПО - это балансирование на грани фола, постоянные дедлоки. Помните, Jet is not thread safe , поэтому update лучше напрямую, а не через view.
...
Рейтинг: 0 / 0
Представление + Триггер Instead of update
    #39666089
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volt,

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


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