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

Откуда:
Сообщений: 226
Здравствуйте.

Как в триггере на Update изменить значение поля записи, которая изменяется?
Если делать так, то происходит блокировка
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)
12 дек 19, 11:16    [22038483]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
court
Member

Откуда:
Сообщений: 2020
roma1975
Как в триггере на Update изменить значение поля записи, которая изменяется?
INSTEAD OF триггер, не ?
12 дек 19, 11:29    [22038497]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
roma1975
Member

Откуда:
Сообщений: 226
Я делал такой триггер
ALTER TRIGGER [dbo].[counting_denom_update] 
   ON  [dbo].[t_g_counting_denom] 
   AFTER UPDATE
12 дек 19, 11:36    [22038505]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
roma1975
Если делать так, то происходит блокировка
А id_card - это PK?
12 дек 19, 12:52    [22038592]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
roma1975
Member

Откуда:
Сообщений: 226
Нет в таблице t_g_counting_denom поле id первичный ключ.
12 дек 19, 13:47    [22038643]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
court
Member

Откуда:
Сообщений: 2020
roma1975
Я делал такой триггер
ALTER TRIGGER [dbo].[counting_denom_update] 
   ON  [dbo].[t_g_counting_denom] 
   AFTER UPDATE
ну так переделай на INSTEAD OF триггер
или запрети рекурсивный вызов триггеров
или проверку в начале триггера на то, что обновляется только поле flschet1 и выход (но это из разряда "плохих советов" :) )
12 дек 19, 14:21    [22038683]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
roma1975
Нет в таблице t_g_counting_denom поле id первичный ключ.
Так и джойньте по PK. Если вам надо обновлять только затронутые в триггере (то есть находящиеся в inserted) записи.

roma1975
Если делать так, то происходит блокировка
Кстати, а что это значит? А то, может, мы про разные ошибки говорим?
12 дек 19, 16:58    [22038955]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
roma1975
Member

Откуда:
Сообщений: 226
И какой же должен быть триггер?

Этот триггер тоже приводит к блокировке записей
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
13 дек 19, 08:55    [22039335]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
roma1975
Member

Откуда:
Сообщений: 226
То есть выходит ошибка параллелизма, что-типа задействовано 1 или более записи, которые уже обновляются.
13 дек 19, 08:57    [22039337]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
roma1975
Member

Откуда:
Сообщений: 226
И при чем здесь id если мы обновляем записи и в триггере некорректно обновляются эти же записи? Как же правильно написать корректное обновление? В oracle сделали просто присвоил new.fl значение и не надо парится, а здесь чего-то непонятно.
13 дек 19, 09:01    [22039342]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
roma1975
То есть выходит ошибка параллелизма, что-типа задействовано 1 или более записи, которые уже обновляются.
Скопируйте уже ошибку сюда.
13 дек 19, 09:42    [22039379]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
roma1975
В oracle сделали просто присвоил new.fl значение и не надо парится, а здесь чего-то непонятно.
Думаю, у вас просто ошибка в коде. Наверняка Оракл тоже плохо работает с ошибочным кодом.
roma1975
Этот триггер тоже приводит к блокировке записей
Мы же не видим модели данных и самих данных, откуда нам знать, какой должен быть правильный триггер?

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

Вы сделали некий запрос, он привёл к ошибке, вот вы и скопируйте сюда и запрос, и ошибку.
roma1975
 where id_card in (select id_card from inserted)	and source in (select source from inserted)
Это условие абсурдное. Оно апдэйтит не только те записи, которые изменились, но и другие.

Как правильно переписать, я вам уже сказал.
13 дек 19, 09:48    [22039383]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
roma1975
И при чем здесь id если мы обновляем записи и в триггере некорректно обновляются эти же записи? Как же правильно написать корректное обновление? В oracle сделали просто присвоил new.fl значение и не надо парится, а здесь чего-то непонятно.
Вы обновляете не "эти же" записи. Связка по id укажет обновить именно те записи, которые затронуты триггером.
13 дек 19, 09:49    [22039384]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
roma1975
Member

Откуда:
Сообщений: 226
Ошибка такая:

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


Структура таблицы
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


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

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)

без триггера программа работает нормально.
13 дек 19, 09:57    [22039392]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
roma1975
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
13 дек 19, 10:16    [22039403]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
roma1975
Триггер такой

ALTER TRIGGER [dbo].[counting_denom_update1] 
   ON  [dbo].[t_g_counting_denom] 
INSTEAD OF UPDATE 
Да, и ещё, когда вам посоветовали использовать триггер INSTEAD OF UPDATE , нужно было всё таки про него прочитать.
Просто этот триггер отменяет апдэйт таблицы, она вообще теперь у вас не обновляется.
13 дек 19, 10:18    [22039406]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление изменяющегося поля  [new]
roma1975
Member

Откуда:
Сообщений: 226
Да спасибо. А да там кроме триггера INSTEAD OF UPDATE у меня еще триггер на обновление стоял, поэтому в приложении клиентском возникала ошибка, когда я этот триггер добавил.
13 дек 19, 12:21    [22039568]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить