Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер на обновление изменяющегося поля / 17 сообщений из 17, страница 1 из 1
12.12.2019, 11:16
    #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
12.12.2019, 11:29
    #39901748
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
roma1975
Как в триггере на Update изменить значение поля записи, которая изменяется?
INSTEAD OF триггер, не ?
...
Рейтинг: 0 / 0
12.12.2019, 11:36
    #39901752
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
Я делал такой триггер
Код: sql
1.
2.
3.
ALTER TRIGGER [dbo].[counting_denom_update] 
   ON  [dbo].[t_g_counting_denom] 
   AFTER UPDATE
...
Рейтинг: 0 / 0
12.12.2019, 12:52
    #39901800
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
roma1975
Если делать так, то происходит блокировка
А id_card - это PK?
...
Рейтинг: 0 / 0
12.12.2019, 13:47
    #39901838
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
Нет в таблице t_g_counting_denom поле id первичный ключ.
...
Рейтинг: 0 / 0
12.12.2019, 14:21
    #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
12.12.2019, 16:58
    #39902027
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
roma1975
Нет в таблице t_g_counting_denom поле id первичный ключ.
Так и джойньте по PK. Если вам надо обновлять только затронутые в триггере (то есть находящиеся в inserted) записи.

roma1975
Если делать так, то происходит блокировка
Кстати, а что это значит? А то, может, мы про разные ошибки говорим?
...
Рейтинг: 0 / 0
13.12.2019, 08:55
    #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
13.12.2019, 08:57
    #39902293
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
То есть выходит ошибка параллелизма, что-типа задействовано 1 или более записи, которые уже обновляются.
...
Рейтинг: 0 / 0
13.12.2019, 09:01
    #39902295
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
И при чем здесь id если мы обновляем записи и в триггере некорректно обновляются эти же записи? Как же правильно написать корректное обновление? В oracle сделали просто присвоил new.fl значение и не надо парится, а здесь чего-то непонятно.
...
Рейтинг: 0 / 0
13.12.2019, 09:42
    #39902316
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
roma1975
То есть выходит ошибка параллелизма, что-типа задействовано 1 или более записи, которые уже обновляются.
Скопируйте уже ошибку сюда.
...
Рейтинг: 0 / 0
13.12.2019, 09:48
    #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
13.12.2019, 09:49
    #39902321
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
roma1975
И при чем здесь id если мы обновляем записи и в триггере некорректно обновляются эти же записи? Как же правильно написать корректное обновление? В oracle сделали просто присвоил new.fl значение и не надо парится, а здесь чего-то непонятно.
Вы обновляете не "эти же" записи. Связка по id укажет обновить именно те записи, которые затронуты триггером.
...
Рейтинг: 0 / 0
13.12.2019, 09:57
    #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
13.12.2019, 10:16
    #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
13.12.2019, 10:18
    #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
13.12.2019, 12:21
    #39902448
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер на обновление изменяющегося поля
Да спасибо. А да там кроме триггера INSTEAD OF UPDATE у меня еще триггер на обновление стоял, поэтому в приложении клиентском возникала ошибка, когда я этот триггер добавил.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер на обновление изменяющегося поля / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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