Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
Есть таблица tab. В ней поле idz - identity
Другие поля, например, gr1,cl,og,idz1

В таблицу вносятся данные, в которых значение в поле idz1>0
Если эти данные (с таким же idz1) уже есть в таблице, то запись нужно обновить (сохранить idz без изменений).

После выполнения команды в триггере:
UPDATE tab SET gr1=a.gr1, cl=a.cl, og=a.og FROM inserted a WHERE tab.idz1=a.idz1 AND a.idz1>0
В таблице все записи с idz1>0, которые там уже были, исчезают.

Создаю таблицу tab1, аналогичную tab. Выполняю команду:

UPDATE tab1 SET gr1=a.gr1, cl=a.cl, og=a.og FROM tab a WHERE tab1.idz1=a.idz1 AND a.idz1>0

Все правильно обновляется, ничего не теряется.

В чем может быть проблема?
4 июл 05, 14:08    [1672113]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
автор
В таблице все записи с idz1>0, которые там уже были, исчезают.

Зато, наверное, они в deleted есть. idz1 апдейтите, что ли?
4 июл 05, 14:11    [1672135]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
Гавриленко Сергей Алексеевич
автор
В таблице все записи с idz1>0, которые там уже были, исчезают.

Зато, наверное, они в deleted есть. idz1 апдейтите, что ли?


Извиняюсь, не сказал, что триггер - INSTEAD OF INSERT
4 июл 05, 14:13    [1672147]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Хм... все работает:
create table t (id int primary key identity, f int, id1 int)
go
insert t (f, id1)
select 1, 1 union all
select 2, 2 union all
select 3, 3
go
create trigger t_trg on t
instead of insert
as
  update t
  set f = i.f
  from inserted i
  where t.id1 = i.id1
    and i.id1 > 0
go
select * from t
go
insert t (f, id1)
values (2, 3)
go
select * from t
go
drop trigger t_trg
drop table t
.... или автор что-то недоговаривает или...

2автор: может стоит уже выложить скрипты таблицы и триггера? Может есть еще что-то, о чем мы не знаем? Заодно и результат select
@@version сюда же неплохо было бы положить.

Posted via ActualForum NNTP Server 1.2

4 июл 05, 14:32    [1672271]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
Должен еще уточнить. Сменил в таблице-источнике значения в поле idz (они стали различаться в tab и tab1).

И записи из tab1 тоже стали исчезать.

Не пойму я, в условии же все сказано - Update те записи, у которых a.idz1>0 и tab1.idz1=a.idz1
4 июл 05, 14:33    [1672284]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
SELECT @@version
Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
4 июл 05, 14:36    [1672301]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/forum/actualthread.aspx?tid=169633
4 июл 05, 14:37    [1672312]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Для начала стоит накатить SP3 на сервер SQL.

Posted via ActualForum NNTP Server 1.2

4 июл 05, 14:40    [1672325]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
Аналогично работает на другом SQL-сервере с SP3
4 июл 05, 14:46    [1672359]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mikalai
Аналогично работает на другом SQL-сервере с SP3

Мы когда нибудь увидим полный рабочий/нерабочий скрипт вашего "аналогично" ?
4 июл 05, 14:54    [1672413]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
Цепочка внесения данных такова - из текстового поля одной таблицы берется xml c данными, затем параметром передается процедуре, которая разбирает XML и вносит данные в таблицу, указанную в XML.

Я попробую вырезать часть данных и обрезать скрипт по созданию таблицы (в ней 50 полей), чтобы сильно здесь не нагромождать
4 июл 05, 15:32    [1672614]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
Все это смешно и грустно, но в интерактиве работает

CREATE TABLE [dbo].[tab] (
[gr1] [smallint] NOT NULL ,
[udal] [smallint] NULL ,
[org] [int] NOT NULL ,
[idz1] [bigint] NOT NULL ,
[idbd] [bigint] NOT NULL ,
[rab] [smallint] NOT NULL ,
[idz] [bigint] IDENTITY (1, 1) NOT NULL ,
[katr] [smallint] NOT NULL ,
[zbv] [varchar] (40) COLLATE Cyrillic_General_CI_AS NULL ,
[zbn] [varchar] (40) COLLATE Cyrillic_General_CI_AS NULL ,
[taty] [varchar] (40) COLLATE Cyrillic_General_CI_AS NULL ,
[r_taty] [smallint] NULL ,
[pr_taty] [smallint] NULL ,
[idf] [int] NULL ,
[c_gu] [smallint] NULL ,
[f_gu] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
[m_gu] [varchar] (30) COLLATE Cyrillic_General_CI_AS NULL ,
[brc] [smallint] NULL ,
[sreg] [smallint] NOT NULL ,
[sreg2] [smallint] NOT NULL ,
[dr] [smalldatetime] NULL ,
[pol] [smallint] NULL ,
[vz] [int] NULL ,
[godr] [varchar] (5) COLLATE Cyrillic_General_CI_AS NULL ,
[di] [smalldatetime] NOT NULL ,
[vnp] [smallint] NULL ,
[timez] [varchar] (5) COLLATE Cyrillic_General_CI_AS NULL ,
[noms] [smallint] NULL ,
[dsn] [smalldatetime] NULL ,
[rabota] [varchar] (80) COLLATE Cyrillic_General_CI_AS NULL ,
[vi] [varchar] (5) COLLATE Cyrillic_General_CI_AS NULL ,
[tel] [smallint] NULL ,
[ots] [smallint] NULL ,
[rst] [smallint] NULL ,
[vhnom] [smallint] NULL ,
[s_tr] [smallint] NULL ,
[sm_tr] [smallint] NULL ,
[dtr] [smalldatetime] NULL ,
[postp] [smallint] NULL ,
[grkr] [smallint] NULL ,
[rez] [smallint] NULL ,
[rod] [smallint] NULL ,
[ber] [smallint] NULL ,
[dpz] [smalldatetime] NULL ,
[rezult] [smallint] NOT NULL ,
[str] [smallint] NULL ,
[obl] [smallint] NOT NULL ,
[knr] [smallint] NULL ,
[reg] [smallint] NULL ,
[nasp] [varchar] (20) COLLATE Cyrillic_General_CI_AS NULL ,
[ndom] [varchar] (4) COLLATE Cyrillic_General_CI_AS NULL ,
[korp] [varchar] (2) COLLATE Cyrillic_General_CI_AS NULL ,
[kv] [varchar] (4) COLLATE Cyrillic_General_CI_AS NULL ,
[dom] [varchar] (60) COLLATE Cyrillic_General_CI_AS NULL ) ON [PRIMARY]
GO
insert tab (gr1, udal,org,idz1,idbd,rab,katr,sreg,sreg2,di,rezult,obl)
select 1,Null,1,1,1,1,1,1,1,1,1,1 union all
select 1,Null,2,2,2,1,1,1,1,1,1,1 union all
select 3,Null,3,3,3,3,3,3,3,3,3,3
go
CREATE TRIGGER [tab_ins] ON [dbo].[tab]
INSTEAD OF INSERT
AS
UPDATE tab SET gr1=a.gr1, udal=a.udal, org=a.org, idbd=a.idbd, rab=1, katr=a.katr, sreg=a.sreg, sreg2=a.sreg2, dr=a.dr, pol=a.pol, vz=a.vz, godr=a.godr, di=a.di, vnp=a.vnp, timez=a.timez, noms=a.noms, dsn=a.dsn, rabota=a.rabota, vi=a.vi, tel=a.tel, ots=a.ots, rst=a.rst, vhnom=a.vhnom, s_tr=a.s_tr, sm_tr=a.sm_tr, dtr=a.dtr, postp=a.postp, grkr=a.grkr, rez=a.rez, rod=a.rod, ber=a.ber, dpz=a.dpz, rezult=a.rezult, str=a.str, obl=a.obl, knr=a.knr, reg=a.reg, nasp=a.nasp, ndom=a.ndom, korp=a.korp, kv=a.kv, dom=a.dom, zbv=a.zbv, zbn=a.zbn FROM inserted a WHERE tab.idz1=a.idz1 AND a.idz1>0
INSERT INTO tab (gr1, udal, org, idz1, idbd, rab, katr, idf, sreg, sreg2, dr, pol, vz, godr, di, vnp, timez, noms, dsn, rabota, vi, tel, ots, rst, vhnom, s_tr, sm_tr, dtr, postp, grkr, rez, rod, ber, dpz, rezult, str, obl, knr, reg, nasp, ndom, korp, kv, dom, zbv, zbn) SELECT gr1, udal, org, idz1, idbd, 1, katr, idf, sreg, sreg2, dr, pol, vz, godr, di, vnp, timez, noms, dsn, rabota, vi, tel, ots, rst, vhnom, s_tr, sm_tr, dtr, postp, grkr, rez, rod, ber, dpz, rezult, str, obl, knr, reg, nasp, ndom, korp, kv, dom, zbv, zbn FROM inserted WHERE inserted.idz>0 AND NOT Exists (SELECT * FROM tab WHERE tab.idz1>0 AND inserted.idz1>0 AND inserted.idz1=tab.idz1)
go
select * from tab
go
insert tab (gr1, udal,org,idz1,idbd,rab,katr,sreg,sreg2,di,rezult,obl,nasp)
select 5,Null,1,1,1,1,1,1,1,1,1,1,3 union all
select 6,Null,2,2,2,1,1,1,1,1,1,1,4 union all
select 7,Null,3,3,3,3,3,3,3,3,3,3,5

go
select * from tab
go
drop trigger tab_ins
drop table tab
4 июл 05, 16:17    [1672879]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

автор
После выполнения команды в триггере:
UPDATE tab SET gr1=a.gr1, cl=a.cl, og=a.og FROM inserted a WHERE tab.idz1=a.idz1 AND a.idz1>0
В таблице все записи с idz1>0, которые там уже были, исчезают.

Ты уверен что они "исчезают" именно после выполнения этой команды? Может еще триггер какой на этой таблице есть?


Posted via ActualForum NNTP Server 1.2

4 июл 05, 16:28    [1672957]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
Других триггеров нет. Поставил первой строкой команду копирования содержимого inserted в другую таблицу - все входные записи там появились

INSERT INTO tab1 (gr1, udal, org, idz1, idbd, rab, katr, idf, sreg, sreg2, dr, pol, vz, godr, di, vnp, timez, noms, dsn, rabota, vi, tel, ots, rst, vhnom, s_tr, sm_tr, dtr, postp, grkr, rez, rod, ber, dpz, rezult, str, obl, knr, reg, nasp, ndom, korp, kv, dom, zbv, zbn) SELECT gr1, udal, org, idz1, idbd, 1, katr, idf, sreg, sreg2, dr, pol, vz, godr, di, vnp, timez, noms, dsn, rabota, vi, tel, ots, rst, vhnom, s_tr, sm_tr, dtr, postp, grkr, rez, rod, ber, dpz, rezult, str, obl, knr, reg, nasp, ndom, korp, kv, dom, zbv, zbn FROM inserted WHERE inserted.idz1>0
4 июл 05, 16:34    [1673002]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Запустите профайлер и под ним выполните оба вариант - рабочий и нерабочий. Посмотрите разницу.
4 июл 05, 16:36    [1673020]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Кстати, вот это:

INSERT INTO tab (gr1, udal, org, idz1, idbd, rab, katr, idf, sreg, sreg2, dr, pol, vz, godr, di, vnp, timez, noms, dsn, rabota, vi, tel, ots, rst, vhnom, s_tr, sm_tr, dtr, postp, grkr, rez, rod, ber, dpz, rezult, str, obl, knr, reg, nasp, ndom, korp, kv, dom, zbv, zbn) SELECT gr1, udal, org, idz1, idbd, 1, katr, idf, sreg, sreg2, dr, pol, vz, godr, di, vnp, timez, noms, dsn, rabota, vi, tel, ots, rst, vhnom, s_tr, sm_tr, dtr, postp, grkr, rez, rod, ber, dpz, rezult, str, obl, knr, reg, nasp, ndom, korp, kv, dom, zbv, zbn FROM inserted WHERE inserted.idz>0 AND NOT Exists (SELECT * FROM tab WHERE tab.idz1>0 AND inserted.idz1>0 AND inserted.idz1=tab.idz1)
у тебя никогда записи добавлять не будет пока IDENTITY_INSERT не включен.
Должно быть (мое мнение):
INSERT INTO tab (gr1, udal, org, idz1, idbd, rab, katr, idf, sreg, sreg2, dr, pol, vz, godr, di, vnp, timez, noms, dsn, rabota, vi, tel, ots, rst, vhnom, s_tr, sm_tr, dtr, postp, grkr, rez, rod, ber, dpz, rezult, str, obl, knr, reg, nasp, ndom, korp, kv, dom, zbv, zbn) 
SELECT gr1, udal, org, idz1, idbd, 1, katr, idf, sreg, sreg2, dr, pol, vz, godr, di, vnp, timez, noms, dsn, rabota, vi, tel, ots, rst, vhnom, s_tr, sm_tr, dtr, postp, grkr, rez, rod, ber, dpz, rezult, str, obl, knr, reg, nasp, ndom, korp, kv, dom, zbv, zbn 
FROM inserted
WHERE NOT Exists (SELECT * FROM tab WHERE inserted.idz1>0 AND inserted.idz1=tab.idz1)
4 июл 05, 17:08    [1673211]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
GreenSunrise
Запустите профайлер и под ним выполните оба вариант - рабочий и нерабочий. Посмотрите разницу.

Так и так понятно, что вся моя проблема в Update. Оставляю одну эту команду в триггере - после нее данные исчезают. А в интерактиве все работает как часы.
4 июл 05, 17:09    [1673221]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Пример "интерактива" приведите. А то совершенно не понятно о чем идет речь.

Posted via ActualForum NNTP Server 1.2

4 июл 05, 17:10    [1673229]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Glory
Member

Откуда:
Сообщений: 104760
Mikalai
Так и так понятно, что вся моя проблема в Update. Оставляю одну эту команду в триггере - после нее данные исчезают. А в интерактиве все работает как часы.


UPDATE уж точно не может удалить данные
4 июл 05, 17:12    [1673254]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Я так понимаю, у него "удалить" = не добавить (insert не добавляет записи из вставляемого набора). Выше вариант как поправить insert
что бы работал.

Posted via ActualForum NNTP Server 1.2

4 июл 05, 17:15    [1673270]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Профайлер рулит, что бы вы не говорили. Мало ли, что у вас в действительности происходит. Может, какой триггер срабатывает позабытый и позаброшенный. Может, какой джоб активизируется и стирает ваши данные. Может, у вас там репликация, которая откаты из-за констрейнтов делает. Может еще десяток причин. Мы же вашей рабочей среды не видим.

Мое личное мнение, которое я навязывать вам никоим образом не собираюсь, - профайлер. Все сразу будет понятно. Разница будет очевидная.
4 июл 05, 17:16    [1673287]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
Roman S. Golubin
Кстати, вот это:
у тебя никогда записи добавлять не будет пока IDENTITY_INSERT не включен.
Должно быть (мое мнение):

Я когда перенабирал в inserted.idz1>0 потерял "1"
Но я не вставляю ничего в поле idz (c identity) поэтому работает Insert.

Да и вообще в триггере Update записи удаляет, а потом Insert их же добавляет. но уже с новым idz, что плохо.

Добавлю по поводу версии SQL - аналогичная ситуация под Win 2003 Server, а там без SP3 (2) SQL не работает.
4 июл 05, 17:17    [1673294]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Но update не удаляет записи - он не умеет их удалять ;-)))
Лог профайлера выложи сюда - тебе все по полочкам разложат - что за чем у тебя происходит и почему.

Posted via ActualForum NNTP Server 1.2

4 июл 05, 17:24    [1673350]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
Mikalai
Member

Откуда: Belarus
Сообщений: 81
Roman S. Golubin

Лог профайлера выложи сюда - тебе все по полочкам разложат - что за чем у тебя происходит и почему.

Выложу, как только пользоваться научусь. Пока же он мне рисует в одну строчку вызов процедуры, в которую данные передаются. А дальше "Audit Logout"
4 июл 05, 17:47    [1673517]     Ответить | Цитировать Сообщить модератору
 Re: Неправильно работает UPDATE в триггере. Без триггера - правильно  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Используйте шаблон SQLProfilerTSQL_SPs. Плюс к тем Data Columns стоят по умолчанию для этого шаблона добавьте еще одну - Application Name.
4 июл 05, 18:05    [1673640]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить