powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер на обновление изменяющегося поля
17 сообщений из 17, страница 1 из 1
Триггер на обновление изменяющегося поля
    #39901737
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Как в триггере на Update изменить значение поля записи, которая изменяется?
Если делать так, то происходит блокировка
Код: sql
1.
update [dbo].[t_g_counting_denom]   set flschet1=isnull(flschet1,0)+1 where id_card in (select id_card from inserted)	and source in (select source from inserted)
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39901748
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
Как в триггере на Update изменить значение поля записи, которая изменяется?
INSTEAD OF триггер, не ?
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39901752
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делал такой триггер
Код: sql
1.
2.
3.
ALTER TRIGGER [dbo].[counting_denom_update] 
   ON  [dbo].[t_g_counting_denom] 
   AFTER UPDATE
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39901800
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
Если делать так, то происходит блокировка
А id_card - это PK?
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39901838
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет в таблице t_g_counting_denom поле id первичный ключ.
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39901860
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
Я делал такой триггер
Код: sql
1.
2.
3.
ALTER TRIGGER [dbo].[counting_denom_update] 
   ON  [dbo].[t_g_counting_denom] 
   AFTER UPDATE

ну так переделай на INSTEAD OF триггер
или запрети рекурсивный вызов триггеров
или проверку в начале триггера на то, что обновляется только поле flschet1 и выход (но это из разряда "плохих советов" :) )
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902027
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
Нет в таблице t_g_counting_denom поле id первичный ключ.
Так и джойньте по PK. Если вам надо обновлять только затронутые в триггере (то есть находящиеся в inserted) записи.

roma1975
Если делать так, то происходит блокировка
Кстати, а что это значит? А то, может, мы про разные ошибки говорим?
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902292
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И какой же должен быть триггер?

Этот триггер тоже приводит к блокировке записей
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
alter TRIGGER [dbo].[counting_denom_update1] 
   ON  [dbo].[t_g_counting_denom] 
INSTEAD OF UPDATE 
AS 
BEGIN
	SET NOCOUNT ON;
update [dbo].[t_g_counting_denom]   set flschet1=isnull(flschet1,0)+1 where id_card in (select id_card from inserted)	and source in (select source from inserted)
END
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902293
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть выходит ошибка параллелизма, что-типа задействовано 1 или более записи, которые уже обновляются.
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902295
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И при чем здесь id если мы обновляем записи и в триггере некорректно обновляются эти же записи? Как же правильно написать корректное обновление? В oracle сделали просто присвоил new.fl значение и не надо парится, а здесь чего-то непонятно.
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902316
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
То есть выходит ошибка параллелизма, что-типа задействовано 1 или более записи, которые уже обновляются.
Скопируйте уже ошибку сюда.
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902320
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
В oracle сделали просто присвоил new.fl значение и не надо парится, а здесь чего-то непонятно.
Думаю, у вас просто ошибка в коде. Наверняка Оракл тоже плохо работает с ошибочным кодом.
roma1975
Этот триггер тоже приводит к блокировке записей
Мы же не видим модели данных и самих данных, откуда нам знать, какой должен быть правильный триггер?

Вы для начала ошибку приведите.

Вы сделали некий запрос, он привёл к ошибке, вот вы и скопируйте сюда и запрос, и ошибку.
roma1975
Код: sql
1.
 where id_card in (select id_card from inserted)	and source in (select source from inserted)

Это условие абсурдное. Оно апдэйтит не только те записи, которые изменились, но и другие.

Как правильно переписать, я вам уже сказал.
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902321
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
И при чем здесь id если мы обновляем записи и в триггере некорректно обновляются эти же записи? Как же правильно написать корректное обновление? В oracle сделали просто присвоил new.fl значение и не надо парится, а здесь чего-то непонятно.
Вы обновляете не "эти же" записи. Связка по id укажет обновить именно те записи, которые затронуты триггером.
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902327
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка такая:

Нарушение параллелизма:
Код: sql
1.
UpdateCommand затронула 0 из ожидаемых 1 записей.



Структура таблицы
Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
CREATE TABLE [dbo].[t_g_counting_denom](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[id_counting] [bigint] NOT NULL,
	[id_card] [bigint] NOT NULL,
	[id_denomination] [bigint] NOT NULL,
	[id_condition] [bigint] NULL,
	[creation] [datetime] NOT NULL,
	[lastupdate] [datetime] NOT NULL,
	[last_user_update] [bigint] NOT NULL,
	[workstation] [nvarchar](50) NULL,
	[count] [int] NULL,
	[reject_count] [int] NULL,
	[fact_value] [decimal](19, 4) NULL,
	[source] [int] NOT NULL,
	[serial_number] [nchar](30) NULL,
	[serial_number2] [nchar](30) NULL,
	[description] [nchar](30) NULL,
	[description1] [nvarchar](50) NULL,
	[flschet1] [int] NULL,
 CONSTRAINT [PK_t_g_counting_denom] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[t_g_counting_denom] ADD  CONSTRAINT [DF_t_g_counting_denom_flschet1]  DEFAULT ((0)) FOR [flschet1]
GO

ALTER TABLE [dbo].[t_g_counting_denom]  WITH CHECK ADD  CONSTRAINT [FK_t_g_counting_denom_t_g_cards] FOREIGN KEY([id_card])
REFERENCES [dbo].[t_g_cards] ([id])
GO

ALTER TABLE [dbo].[t_g_counting_denom] CHECK CONSTRAINT [FK_t_g_counting_denom_t_g_cards]
GO

ALTER TABLE [dbo].[t_g_counting_denom]  WITH CHECK ADD  CONSTRAINT [FK_t_g_counting_denom_t_g_denomination] FOREIGN KEY([id_denomination])
REFERENCES [dbo].[t_g_denomination] ([id])
GO

ALTER TABLE [dbo].[t_g_counting_denom] CHECK CONSTRAINT [FK_t_g_counting_denom_t_g_denomination]
GO

ALTER TABLE [dbo].[t_g_counting_denom]  WITH CHECK ADD  CONSTRAINT [FK_t_g_counting_t_g_counting_denom] FOREIGN KEY([id_counting])
REFERENCES [dbo].[t_g_counting] ([id])
GO

ALTER TABLE [dbo].[t_g_counting_denom] CHECK CONSTRAINT [FK_t_g_counting_t_g_counting_denom]
GO



Триггер такой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
ALTER TRIGGER [dbo].[counting_denom_update1] 
   ON  [dbo].[t_g_counting_denom] 
INSTEAD OF UPDATE 
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	

	
	update [dbo].[t_g_counting_denom]   set flschet1=isnull(flschet1,0)+1 where id_card in (select id_card from inserted)	and source in (select source from inserted)
	

	

END



запрос приводящий к ошибке(он в триггере)
update [dbo].[t_g_counting_denom] set flschet1=isnull(flschet1,0)+1 where id_card in (select id_card from inserted) and source in (select source from inserted)

без триггера программа работает нормально.
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902335
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
Код: sql
1.
UpdateCommand затронула 0 из ожидаемых 1 записей.

Что это, даже номера нет???
Вы точно скопировали текст?
Это вообще похоже на ошибку клиентского приложения, и к работе триггера отношения не имеет. Что не значит, что триггер у вас правильный - в нём всё равно ошибки.

roma1975
update [dbo].[t_g_counting_denom] set flschet1=isnull(flschet1,0)+1 where id_card in (select id_card from inserted) and source in (select source from inserted)
Нет, я говорил про тот ваш запрос, после выполнения которого показывается ошибка.

У вас же показывается ошибка при каких то обновлениях таблицы?
Вы делаете update, триггер срабатывает, и сиквел возвращает ошибку.

Вот и нужно скопировать сюда этот апдэйт и эту ошибку.
Ошибка начинается со строки:
Msg 12345, Level 16, State 1, Line 2
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902336
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
Триггер такой

Код: sql
1.
2.
3.
ALTER TRIGGER [dbo].[counting_denom_update1] 
   ON  [dbo].[t_g_counting_denom] 
INSTEAD OF UPDATE 

Да, и ещё, когда вам посоветовали использовать триггер INSTEAD OF UPDATE , нужно было всё таки про него прочитать.
Просто этот триггер отменяет апдэйт таблицы, она вообще теперь у вас не обновляется.
...
Рейтинг: 0 / 0
Триггер на обновление изменяющегося поля
    #39902448
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да спасибо. А да там кроме триггера INSTEAD OF UPDATE у меня еще триггер на обновление стоял, поэтому в приложении клиентском возникала ошибка, когда я этот триггер добавил.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер на обновление изменяющегося поля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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