Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 грабли deleted и inserted в тригерах  [new]
V&OL
Guest
Привет всем !!!

У меня проблема, хотя о ней уже было ранее, но необходимо кое-что уточнить...

create trigger tr_trigger_delete on tr for insert,update,delete as
declare @ins int, @del int
declare @msg varchar(32)
select @ins =count(*) from inserted
select @del =count(*) from deleted
SET @msg = case
when @del>0 and @ins>0 then 'updated'
when @del>0 and @ins = 0 then 'deleted'
when @del=0 and @ins > 0 then 'inserted'
when @del=0 and @ins = 0 and (COLUMNS_UPDATED()>0) --Здесь дожно быть что-то, типа инсерт новые значения then 'inserted/updated'
else 'deleted'
end
print @msg

Приблизительно такой триггер, но мой следит за изменениями, добавлениями и удалениями
Проблема какой запрос необходимо писать в случае @del=0 and @ins = 0
т.е. к deleted и inserted мы обратиться не можем т.к. там пусто

Проблема обнаружена в EM, при добавлении записи, смещаемся на другую, перемещаемся на добавленную, пытаемся её изменить и.... грабли
Кто знает поделитесь мыслями. Заранее сп-бо.
6 дек 04, 10:32    [1159371]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Если @del=0 и @ins = 0 то какие могут быть "типа инсерт новые значения " ?
Ни одна из записей ведь не была затронута запросом.

Проблема обнаружена в EM, при добавлении записи, смещаемся на другую, перемещаемся на добавленную, пытаемся её изменить и.... грабли
Ну так надо набор рефшрешить чтобы такого не было.
6 дек 04, 10:41    [1159399]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
VOLEG
Member

Откуда:
Сообщений: 106
ДЛЯ Glory
Ну так надо набор рефшрешить чтобы такого не было.

Каким образом делается рефшреш. Это раз.
Во-вторых покажу свой триггер.
Create Trigger TriggerSam ON [dbo].[TriggerTable]
instead of INSERT,DELETE,UPDATE as
begin
declare @InsertedCount int
declare @DeletedCount int
Declare @MSG Varchar(8000)
Set @InsertedCount=(Select Count(*) from INSERTED)
Set @DeletedCount=(Select Count(*) from DELETED)
if (@DeletedCount=0 and @InsertedCount=0) --INSERT/UPDATE
begin --Здесь именно у меня вопрос
if UPDATE(name)
-- update [dbo].[TriggerTable]
-- Set Name=(Select NAME from #NEWTABLE)
Commit(1)
commit
goto m1
return
end
if (@DeletedCount>0 and @InsertedCount>0) --UPDATE
begin
Set @MSG='UPDATE GPRS'
Update TriggerTable
set Name=(Select name from inserted),
Cex=(Select cex from inserted)
where id=(select id from deleted)


insert into [dbo].[TriggerTableON]
(IDNew,
NameNew,
CexNew,
Prisnak,
IDStar,
NameStar,
CexStar
)
select a.ID,
a.Name,
a.Cex,
'Update',
b.ID,
b.Name,
b.Cex
from INSERTED a,DELETED b

end

if (@DeletedCount>0 and @InsertedCount=0) --DELETE
begin
Set @MSG='DELETE GPRS'
delete from TriggerTable
where ID in (select ID from DELETED)
Insert into [dbo].[TriggerTableON]
(IDStar,
NameStar,
CexStar,
Prisnak
)
select ID,
Name,
Cex,
'Delete'
from Deleted

end



if (@DeletedCount=0 and @InsertedCount>0) --INSERT
begin
Set @MSG='INSERT GPRS'
Insert into TriggerTable(name)
Select name from inserted
Insert into [dbo].[TriggerTableON]
(IDNew,
NameNew,
CexNew,
Prisnak
)
select ID,
Name,
Cex,
'Insert'
from INSERTED

end


if ((@MSG is NULL) or (@MSG=''))
Set @MSG='IONOI'
print @MSG
return
m1:
end


Коротко для чего нужен триггер: пока для контроля вносимых изменений юзверями в таблицу: Удалена ли запись, добавлена ли, изменена


inserted deleted операция
0 n delete from
n 0 insert into
n n update
0 0 Если COLUMNS_UPDATED()>0 то insert/update иначе - deleted

из https://www.sql.ru/forum/actualthread.aspx?tid=137268
6 дек 04, 11:55    [1159680]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
делайте три триггера: на insert, update и delete
6 дек 04, 11:58    [1159696]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Каким образом делается рефшреш. Это раз.
Если мы про EM то там такой красный значок "!" на панели инструментов.

0 0 Если COLUMNS_UPDATED()>0 то insert/update иначе - deleted
Еще раз спрошу - если в таблице inserted нет записей и в таблице deleted нет записей, то что собственно было изменено/добавлено/удалено ?
Мой ответ - ничего. И что вы тогда собираетесь записать в лог-таблицу ?
6 дек 04, 12:07    [1159740]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
VOLEG
Member

Откуда:
Сообщений: 106
Для самого остаётся загадкой,
потому и спрашиваю
В существующих примерах нет такой вещи,
а это просто необходимо.
По поводу 3-х триггеров, тоже бесполезно.Пробовал, проверял.
Да в случае с QA ситуация нормальная
делаешь Insert table(поля)
Values(тра ля ля)

Update table
Set поля=траляля

Delete from table
Всё проходит замечательно:
Записывается в таблицу с занесением флага Insert,Update,Delete

В случае с EM или с проектом например Delphi ситуфция изменяется
По шагам:

1) Пытаюсь добавить запись : Все нормально проходит,
2) Перемещаюсь на предыдущую запись
3) Перехожу на запись добавленную в шаге первом
и начинается...
4) пытаюсь изменить запись... или удалить ее
ВЫДАЕТ: Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени последнего чтения

Для Glory нажав в выше упомянутой ситуации на "!" мы теряем изменения только что сделанные
т.е. результат этого дествия - все что до пункта 2
Не понятно что делать в этой ситуации. Откат этого изменения не допускается.
P/S лечится переоткрытием таблицы, но это как было сказано не устраивает
6 дек 04, 13:30    [1160098]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Для Glory нажав в выше упомянутой ситуации на "!" мы теряем изменения только что сделанные
т.е. результат этого дествия - все что до пункта 2

Что-то у вас неверно в утверждениях. Если переоткрывании запроса "тереяются" данные то
- либо изменения не были отправлены на сервер
- либо измененные записи уже не попадают в условия запроса

И еще
ПервичныйКлюч у таблицы есть ? А вы самом запросе он тоже выьирается ?
6 дек 04, 13:34    [1160132]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
а на счёт делфи:
почём ему знать, какой первичный ключ теперь соответствует этой записи(что вы там на сервере сделали), а все операции с записями проходят с учётом значения первичного ключа записи, смотрите профайлером, что делфи отправляет на сервер и увидите, какую строку(с каким значение ПК делфи пытается обновить или удалить)
решение Вашей проблемы Properties['Update Resync']
6 дек 04, 13:42    [1160173]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Alex.Czech
Guest
Сдается мне, что если пусты и таблица inserted, и таблица deleted, это означает что выполнился какой-то запрос не затронувший ни одной записи (типа UPDATE table SET field = 1 WHERE id = 100, а записи с таким id нету). Что в этом случае делать триггеру - это вам виднее, а обсуждается уже какой-то совершенно другой вопрос, откуда такой запрос берется в EM
6 дек 04, 13:42    [1160178]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
VOLEG
Member

Откуда:
Сообщений: 106
Да естесственно в обоих таблицах по первичному ключу
выявил тестированием ошибка здесь
if (@DeletedCount=0 and @InsertedCount=0) --INSERT/UPDATE
begin --Здесь именно у меня вопрос
if UPDATE(name)
-- update [dbo].[TriggerTable]
-- Set Name=(Select NAME from #NEWTABLE)
commit
goto m1
return
end

если нету commit, то ругачка как уже говорил
ВЫДАЕТ: Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени последнего чтения
в случае с соммитом ругачки нет, но изменения не подхватываются.
Явный старт в начале триггера BEGIN TRAN T1, соммит в конце COMMIT T1 также не дают положительного результата.
6 дек 04, 13:47    [1160207]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
VOLEG
Member

Откуда:
Сообщений: 106
для Smirnov Anton
проект Delphi здесь по сути ни причем:
на самом серваке смотрю EM: пытаюсь провести вышеупомянутые манипуляции с первого по четвёртый шаги
Так что копать необходимо со стороны триггера, но вот в какую сторону
бьюсь уже дня четыре головой о стену и ничего......
6 дек 04, 13:58    [1160274]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
а может просто в триггере Set nocount on не хватает?
6 дек 04, 13:59    [1160288]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
я могу на 100% с уверенностью сказать, что в конечном итоге и с делфи будет проблема, в своё время я с ней бился неделю
6 дек 04, 14:03    [1160305]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
VOLEG
Member

Откуда:
Сообщений: 106
Для SergSuper
Попробовал Set nocount on
НЕТ РЕЗУЛТ ТОТ ЖЕ
6 дек 04, 14:08    [1160332]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Попробовал Set nocount on
И куда вы поставили эту команду в своем триггере ?
6 дек 04, 14:15    [1160360]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
VOLEG
Member

Откуда:
Сообщений: 106
Glory И куда вы поставили эту команду в своем триггере ?Create Trigger

TriggerSam ON [dbo].[BalansGTriggerTable]
instead of INSERT,DELETE,UPDATE as
begin
Set nocount on
.................................

т.е. в самом начале тела триггера
6 дек 04, 14:26    [1160396]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
VOLEG
Member

Откуда:
Сообщений: 106
Еще есть у кого мысли по этому поводу,
вопрос в принципе серьезный, и я думаю не я один с этим столкнулся???
7 дек 04, 08:15    [1161989]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Alois
Member

Откуда:
Сообщений: 354
Уберите временно триггер и проделайте в ЕМ то же самое, не меняя структуры самой таблицы. Будут грабли?
7 дек 04, 09:51    [1162192]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Glory
Member

Откуда:
Сообщений: 104760
VOLEG
Еще есть у кого мысли по этому поводу,
вопрос в принципе серьезный, и я думаю не я один с этим столкнулся???

Начните с более простой версии триггера.
7 дек 04, 10:04    [1162239]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
VOLEG
Member

Откуда:
Сообщений: 106
Alois : Уберите временно триггер и проделайте в ЕМ то же самое, не меняя структуры самой таблицы. Будут грабли?
Проделывал все нормально без триггера все работает!!!

Glory : Начните с более простой версии триггера.
Куда еще проще в целом триггер срабатывает, лог пишется, но в ситуфции
(добавлена запись/редактирование этой записи)
или (добавлена запись/удаление этой записи)
возникает вопрос каким образом фиксировать эти изменения

Свои мысли: может быть помимо таблиц INSERTED,DELETED имеется другая таблица или представление, где это отражается,
либо я что-то не так пишу в обработке 0 0 Если COLUMNS_UPDATED()>0 то insert/update
7 дек 04, 10:35    [1162367]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Glory : Начните с более простой версии триггера.
Куда еще проще в целом триггер срабатывает, лог пишется, но в ситуфции

Ваш "простой" вариант ведь не работает ? Ну так значит нужен еще более простой вариант.

но в ситуфции
(добавлена запись/редактирование этой записи)
или (добавлена запись/удаление этой записи)
возникает вопрос каким образом фиксировать эти изменения

Это сугубо клиентская проблема. У сервера нет понятия "редактирование". Потому что нет такой команды. Есть добавить(insert) и изменить (update).
7 дек 04, 10:41    [1162408]     Ответить | Цитировать Сообщить модератору
 Re: грабли deleted и inserted в тригерах  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Имхо, вам давным-давно уже дали правильный совет:
SergSuper
делайте три триггера: на insert, update и delete

Что означает ваше
VOLEG
По поводу 3-х триггеров, тоже бесполезно.Пробовал, проверял

Подробнее, пожалуйста. Как выглядели ваши проверки? С кодом, не на пальцах.


И второй не менее правильный совет для случая, если вам так уж хочется оставить один триггер:
Smirnov Anton
смотрите профайлером, что делфи отправляет на сервер и увидите, какую строку(с каким значение ПК делфи пытается обновить или удалить)

То же самое относится к Enterprise Manager. Смотрите профайлером, что происходит. И не надо будет никаких гаданий на кофейной гуще.
7 дек 04, 11:14    [1162568]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить