|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
Не срабатывает триггер на удаление из таблицы, но данные удаляются. В чём может быть причина? (MS SQL Server 2000 Ent, Windows NT4.0 SP6.) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2000, 10:54 |
|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
Может быть данные удаляются командой TRUNCATE TABLE ??? в этом случае в лог ничего не пишется и триггер не вызывается. Успехов, Александр ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2000, 20:01 |
|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
Нет 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2000, 10:46 |
|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
А ты по одной записи удаляешь, или кучно? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2000, 12:34 |
|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
Если @@ROWCOUNT=0, значимт=0. Если гарантированно Вы удаляете 1 строку, делайте SELECT без WHERE, в противном случае без курсора не обойтись. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2000, 12:34 |
|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
Чтобы убедиться, есть ли что в 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 С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2000, 13:10 |
|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
Причина ошибки очевидно в связке 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 сказал очень мягко... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2000, 15:10 |
|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
AnS1, Fompro, SergSuper, lexeyvg - спасибо за помощь и поддержку. Запись действительно только одна удаляется... А я то полагал, что это объязательная выборка. P.S. Встретите такую книгу "Использование SQL Server 7.0" C.Винкоп - используйте ее в качестве туалетной бумаги. :). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2000, 03:36 |
|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
Я не работал с 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, то произойдет откат как самого удаления, так и всех действий, выполненных в триггере ДО этой команды. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2000, 07:13 |
|
Почему может не работать триггер на удаление?
|
|||
---|---|---|---|
#18+
А можно еще добавить в дурь от мелкософта. Убедился в такой кривизне - если в тригере пишете типа WHERE DELETED.id ..... хрен что работает если не напишу ....... FROM DELETED d WHERE d.ID = ...... Вот такая лабуда с уважением Тимур ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2000, 05:36 |
|
|
start [/forum/topic.php?fid=46&fpage=3597&tid=1827613]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 10ms |
total: | 131ms |
0 / 0 |