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

Откуда:
Сообщений: 45
Добрый день всем. Столкнулся с такой проблемой.
Есть 2 инстанса MS SQL Server 2000 SP3. На каждом существует БД с одной и той же структурой.
Существует некоторый триггер, который выполняется выдаёт разные результаты на двух идентичных БД. А именно.
Есть таблица table1 у неё PK Id. Есть таблица table2, которая имеет
FOREIGN KEY table1(Id) ON DELETE CASCADE
При удалении записи из таблицы table1 дёргается триггер ON DELETE на table2.

В триггере есть выражение
IF EXISTS (SELECT *  FROM  deleted AS t1, dbo.table1 AS t2 WHERE t1.Id = t2.Id )
Так вот это выражение на одинаковых наборах данных в одной БД выдаёт FALSE, а в другой TRUE.
Причём, для приведённого выше селекта @@ROWCOUNT = 0 То есть должно быть FALSE насколько я понимаю.

В таблице table1 есть уникальный индекс по вычисляемому полю. И, соответственно помимо всех установок OLE DB-шных ещё используется SET ARITHABOR ON.
Подскажите в каком напралении копать?
21 дек 04, 17:39    [1197811]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
Crimean
Member

Откуда:
Сообщений: 13148
ОДинаковый триггер на одинаковых данных одинаково работает. Аксиома. Да и при выполнении каскадных операций триггера на "каскадируемые" таблицы не работают вроде как.
21 дек 04, 17:43    [1197825]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
Константин Сергеевич
Member

Откуда:
Сообщений: 154
использование exists в триггере - нежелательно... ибо приводит к тем вещам, которые ты описал...

сделай лучше так:

if(select count(*) from ....)>0
сработает на 100%
21 дек 04, 17:43    [1197828]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
ChA
Member

Откуда: Москва
Сообщений: 11128
Crimean
триггера на "каскадируемые" таблицы не работают вроде как.
А проверить ?
Константин Сергеевич
if(select count(*) from ....)>0
Хороший способ тормозить сервер. Думаю, по этому поводу еще выскажутся... :)
21 дек 04, 17:53    [1197858]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
pr
Member

Откуда:
Сообщений: 45
To Crimean:
AFTER triggers on tables in the chain of cascaded referential actions are then fired, but only if one or more rows in the table have been updated or deleted. 
21 дек 04, 17:56    [1197876]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
Константин Сергеевич
Member

Откуда:
Сообщений: 154
ChA
Думаю, по этому поводу еще выскажутся... :)

значит так мне и нада! :)
21 дек 04, 17:59    [1197891]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
pr
Member

Откуда:
Сообщений: 45
Уважаемые господа, меня интересует сам факт, что если выполняю SELECT непосредственно перед EXISTS, то @ROWCOUNT = 0?
21 дек 04, 18:00    [1197894]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
Константин Сергеевич
Member

Откуда:
Сообщений: 154
автор
pr

слухай, а в чем смысл тваего триггера?
---
не плюй в колодец - вдруг там нет никого
21 дек 04, 18:05    [1197917]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
select 'test'
print @@rowcount
if exists(select 1)
 print 'haha'
print @@rowcount

для спящего время бодрствования равносильно сну
21 дек 04, 18:08    [1197920]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
pr
Member

Откуда:
Сообщений: 45
Алексей2003
select 'test'
print @@rowcount
if exists(select 1)
 print 'haha'
print @@rowcount

для спящего время бодрствования равносильно сну


А вот так
create table #t(n int)
insert into #t(n) VALUES (1)

SELECT * FROM #t WHERE n = 2
print @@rowcount

IF EXISTS (SELECT * FROM #t WHERE n = 2)
	PRINT 'hehe'
ELSE PRINT 'HAHA'

print @@rowcount
DROP TABLE #t

У меня же печатает на предыдущем примере 'hehe'

TO Константин Сергеевич
ДА смысл не столь важен. Важно почему в моей ситуации EXISTS пределяет выражение, которое не выбирает ни одной строки как TRUE ?
21 дек 04, 18:18    [1197943]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645

шутите-с?


для спящего время бодрствования равносильно сну
21 дек 04, 18:26    [1197959]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Мдя. Был неправ. Интересно, откуда я так считал? Явно когда-то натыкался уже...

Тем не менее, все работает:

create table a1 ( id int primary key )
go
create table a2 ( id int primary key references a1( id ) on update cascade on delete cascade )
go
create table a3 ( id int primary key references a2( id ) on update cascade on delete cascade )
go
create trigger t1 on a1 for update, delete as print 't1' return
go
create trigger t2 on a2 for update, delete as print 't2' return
go
create trigger t3 on a3 for update, delete as print 't3' return
go
set nocount off
go
insert into a1 select 1
insert into a2 select 1
insert into a3 select 1
go
update a1 set id = 2
update a2 set id = 2
update a3 set id = 2
go
delete from a1
go
set nocount on
go
select * From a1
select * From a2
select * From a3
go
drop table a3
drop table a2
drop table a1
go
21 дек 04, 18:27    [1197965]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
pr
Member

Откуда:
Сообщений: 45
Алексей2003

шутите-с?


для спящего время бодрствования равносильно сну

неа, абсолютно не шучу. Я имел ввиду в предыдущем примере не этом с haha и hehe, а в моём триггере.
Трассирую процедуру удаления записи из table1. Перехожу на текст триггера. Выполняю select из exists - @@rowcount = 0.
Затем идёт сразу exists и выходит на ветку с true....
21 дек 04, 18:30    [1197975]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а не на пальцах?
а как есть скрипт писать?

для спящего время бодрствования равносильно сну
21 дек 04, 18:33    [1197982]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
pr
Member

Откуда:
Сообщений: 45
Алексей2003
а не на пальцах?
а как есть скрипт писать?

для спящего время бодрствования равносильно сну

А скрипт такой

create table dbo.t11 (nPk int primary key)
go
create table  dbo.t12 (nFk int REFERENCES dbo.t11(nPk) ON DELETE CASCADE)
go
create trigger  dbo.tr1 ON dbo.t12
for delete
as
begin
	if exists (select * 		from 	deleted as tmp1,  
					dbo.t11 as tmp2 
				where tmp1.nFk= tmp2.nPk
				)
		select 'true'
	else
		select 'false'
	
end
go

insert into  dbo.t11 (nPk) values (1)
insert into  dbo.t12 (nFk) values (1)

delete from  dbo.t11 WHERE nPk = 1
GO

drop table dbo.t12
drop table dbo.t11


только у меня в реальном триггере TRUE выскакивает.
Может из-за вычисляемого столбца там что-нить?
21 дек 04, 18:53    [1198036]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
я конечно понимаю, что у Вас там секретность повышенная... НО, без ДДЛя таблиц и реального скрипта гадание на кофейной гуще, ибо если:
только у меня в реальном триггере TRUE выскакивает.
значит в этом примере false, а значит триггер работает нормально.


для спящего время бодрствования равносильно сну
21 дек 04, 18:57    [1198044]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
ChA
Member

Откуда: Москва
Сообщений: 11128
Теперь стало понятней. Одновременно, cascade delete и работа триггера в подчиненной таблице. В этом случае не совсем понятно, что раньше выполнится. В общем, IMHO, ситуация неоднозначности действительно возможна.
21 дек 04, 19:12    [1198071]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS в триггере..  [new]
pr
Member

Откуда:
Сообщений: 45
Народ, я решил проблему...
На том инстансе, на котором всё нормально работало, у меня поверх 3 SP было накачено куммулятивное исправление SQL2000-KB815495-8.00.0818, а на котором тестировал - нет.
В итоге после накат стало всё работать на ура!
Спасибо всем откликнувшимся...
21 дек 04, 20:04    [1198152]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить