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

Откуда:
Сообщений: 178
Коллеги, не можем самостоятельно разобраться с проблемой.
Описание стенда: MS SQL 2005 9.0.4035
БД совместима с SQL 2000.

Есть таблица, предположим:
CREATE TABLE [dbo].[sessions](
[_spid] [smallint] NOT NULL,
[_userinfo] [varchar](512) NOT NULL,
CONSTRAINT [PK__1c_sessions] PRIMARY KEY CLUSTERED
(
[_spid] ASC
)

При входе в программу пользователь выполняет следующую конструкцию:
"declare @userInfo varchar(%d)\n"
"set @userInfo = N'%s'\n"
"if exists (select * from sessions where _spid = @@spid)\n"
" update sessions set _userinfo = @userInfo where _spid = @@spid\n"
" else\n"
" begin\n"
" insert into sessions (_spid, _userinfo) values (@@spid, @userInfo)\n"
"end",

При выполнении этой конструкции происходит удаление записи с другим spid из таблички session,
по профайлеру видно что выполняется только эта конструкция.

На табличку sessions были навешаны два триггера:
ALTER TRIGGER [dbo].[d]
ON [dbo].[sessions]
AFTER DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @str varchar(1000)
declare @str1 varchar(1000)
SELECT @STr = _spid from deleted
SELECT @STr1 = '*'+_userinfo from deleted

insert into Log_sessions
values(getdate(),@str,@str1,@@SPID)
-- Insert statements for trigger here

END

ALTER TRIGGER [dbo].[i]
ON [dbo].[sessions]
AFTER INSERT,update
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @str varchar(1000)
declare @str1 varchar(1000)
SELECT @STr = _spid from inserted
SELECT @STr1 = _userinfo from inserted

insert into Log_sessions
values(getdate(),@str,@str1,@@SPID)
-- Insert statements for trigger here

END

И что мы видим по логу из таблицы Log_sessions по этой ошибке:
2009-11-10 11:03:38.800/649/Объект заблокирован пользователем: БобикМихаил/649
2009-11-10 11:03:38.790/81/*Объект заблокирован пользователем: АлешкинДенис/649
2009-11-10 11:03:38.783/454/*Объект заблокирован пользователем:МитрофановаИрина/649

Причем подчеркиваю, что в трассе только конструкция выше.
Т.е. сначала каким-то образом удаляются два других спида???

Коллеги есть мысли?
11 ноя 09, 10:10    [7911893]     Ответить | Цитировать Сообщить модератору
 Re: Интересное поведение запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
При INSERT и update ну никак не может выполниться delete
11 ноя 09, 10:18    [7911938]     Ответить | Цитировать Сообщить модератору
 Re: Интересное поведение запроса  [new]
gallam
Member

Откуда:
Сообщений: 178
Glory,
И мы были до недавнего времени такого же мнения. )))
Профайлер врет? @@spid - получает некорретно,
update раскладывается на Insert/delete?
Обратите внимание на таблицу лога -
там в последней колонке spid (он последовательно эти действия делает).
11 ноя 09, 10:21    [7911952]     Ответить | Цитировать Сообщить модератору
 Re: Интересное поведение запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
gallam
Glory,
И мы были до недавнего времени такого же мнения. )))
Профайлер врет? @@spid - получает некорретно,
update раскладывается на Insert/delete?
Обратите внимание на таблицу лога -
там в последней колонке spid (он последовательно эти действия делает).

Профайлер вам показывает, что при выполние INSERT и update инициирует delete ?
И вы можете предоставить такую трассу ?
11 ноя 09, 10:25    [7911972]     Ответить | Цитировать Сообщить модератору
 Re: Интересное поведение запроса  [new]
gallam
Member

Откуда:
Сообщений: 178
Glory,
спасибо за ответ.
Вы правы ... нашли конструкцию.
Видите, надо на форум вопрос задать, чтобы быстрее самому найти.
11 ноя 09, 10:32    [7912008]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить