Почему может не работать триггер на удаление?

чайник
Дата: 31.10.2000 10:54:13
Не срабатывает триггер на удаление из таблицы, но данные удаляются. В чём может быть причина? (MS SQL Server 2000 Ent, Windows NT4.0 SP6.)
judge
Дата: 31.10.2000 20:01:15
Может быть данные удаляются командой
TRUNCATE TABLE ???

в этом случае в лог ничего не пишется и триггер не вызывается.

Успехов, Александр
чайник
Дата: 01.11.2000 10:46:15
Нет DELETE FROM. Все уже раз на 10 перетряс. Запись из таблицы удаляется, а в DELETED она не попадает. Почему - хрен поймешь.
Может что-нибудь подскажите:

CREATE TRIGGER [d_out] ON [dbo].[out]
FOR DELETE
AS
DECLARE @c_id INT, @c_id1 TINYINT
BEGIN TRAN
SELECT @c_id = DELETED.id, @c_id1 = DELETED.id1
FROM out o, DELETED
WHERE o.id = DELETED.id
AND o.id1 = DELETED.id1
/*@@rowcount - равен 0 ?????????? */
EXEC p_jurnal @c_id, @c_id1 /* процедура которая не хочет работать в триггере, но просто так работает */
IF (@@error != 0)
BEGIN
ROLLBACK TRAN
RAISERROR ('Произошёл сбой транзакции, попробуйте повторить ещё раз.', 16, -1)
RETURN
END
COMMIT TRAN
AnS1
Дата: 01.11.2000 12:34:06
А ты по одной записи удаляешь, или кучно?
Fompro
Дата: 01.11.2000 12:34:20
Если @@ROWCOUNT=0, значимт=0. Если гарантированно Вы удаляете 1 строку, делайте SELECT без WHERE, в противном случае без курсора не обойтись.
SergSuper
Дата: 01.11.2000 13:10:29
Чтобы убедиться, есть ли что в deleted или нет, проще всего написать в триггере select * from deleted.
А запрос тот может ничего не вернуть, если например id или id1 имеют значение NULL. Чудес то не бывает.

И кстати - транзакцию в триггере объявлять не нужно, триггер и так выполняется внутри транзакции. Сам запрос тоже вызывает вопросы. Точнее вопрос: нахрена связывать 2 таблицы, когда предпологается, что удаляться будет только одна строка? Можно же тогда просто написать:

CREATE TRIGGER d_out ON dbo.out
FOR DELETE
AS
BEGIN
if not exists(select * from deleted) RETURN
DECLARE @c_id INT, @c_id1 TINYINT

SELECT @c_id = id, @c_id1 = id1
FROM DELETED

EXEC p_jurnal @c_id, @c_id1

IF (@@error != 0)
BEGIN
RAISERROR ('Произошёл сбой транзакции, попробуйте повторить ещё раз.', 16, -1)
ROLLBACK TRAN
END

END

С приветом Сергей
alexeyvg
Дата: 01.11.2000 15:10:12
Причина ошибки очевидно в связке
SELECT @c_id = DELETED.id, @c_id1 = DELETED.id1
FROM out o, DELETED
WHERE o.id = DELETED.id
AND o.id1 = DELETED.id1
данные из [out] уже удалены и естественно, rowcount=0
И конечно, срочно выкиньте BEGIN TRAN и COMMIT TRAN: "транзакцию в триггере объявлять не нужно" - это SergSuper сказал очень мягко...
чайник
Дата: 02.11.2000 03:36:15
AnS1, Fompro, SergSuper, lexeyvg - спасибо за помощь и поддержку.
Запись действительно только одна удаляется... А я то полагал, что это объязательная выборка.

P.S. Встретите такую книгу "Использование SQL Server 7.0" C.Винкоп - используйте ее в качестве туалетной бумаги. :).
Garya
Дата: 02.11.2000 07:13:55
Я не работал с SQL Server-2000. Могу прокоментировать текст триггера на основании того, что мне известно об SQL SErver 7.0:
1. Присваивать значения локальным переменным рекомендуется командой SET, а не SELECT.
2. Триггер разработан из предположения, что удаление производится ровно ОДНОЙ записи. Само это предположение в корне не стыкуется с идеологией использования триггеров. Попробуй ответить на вопрос: что должен сделать триггер, если из Query Analyzer выдать команду delete from out БЕЗ фразы where.
3. Часть запроса, в которой указано where o.id = deleted.id НИКОГДА не даст выбрать ни одной записи, поскольку в тот момент, когда происходит выполнение триггера, записи с deleted.id из таблицы out УЖЕ УДАЛЕНЫ - ух там просто нет. Это удаление еще можно откатить, поскольку любая активация триггера выполняется в рамках неявной транзакции.
4. Без внутри триггера добавлять фразу begin tran не стОит. Как я ранее уже заметил, триггер выполняется в рамках неявно запущенной транзакции. Если триггер выполнится до конца и не наткнется на rollbac tran, то все его действия будут зафиксированы. Если в тексте триггера поставить rollback tran, то произойдет откат как самого удаления, так и всех действий, выполненных в триггере ДО этой команды.
Тимур
Дата: 15.11.2000 05:36:42
А можно еще добавить в дурь от мелкософта.
Убедился в такой кривизне -
если в тригере пишете типа WHERE DELETED.id .....
хрен что работает если не напишу
.......
FROM DELETED d
WHERE d.ID = ......
Вот такая лабуда
с уважением
Тимур