2 Ошибки после триггера

6AP6APblCKA

На таблицу повешен триггер:
CREATE TRIGGER ...
	ON ...
	INSTEAD OF INSERT, UPDATE, DELETE
AS
DECLARE ..

	SELECT @InsertedCount=COUNT(*)
		FROM Inserted
	SELECT @DeletedCount=COUNT(*)
		FROM Deleted

	IF @InsertedCount><b>1</b> --INSERT и UPDATE
	BEGIN
			RAISERROR(...)
			RETURN
	END
	IF @InsertedCount><b>0</b> --INSERT и UPDATE
	BEGIN
		IF ...
		BEGIN
			RAISERROR(...)
			RETURN
		END
	END

	IF @InsertedCount><b>0</b> AND @DeletedCount><b>0</b> --UPDATE
	BEGIN
		IF ...
		BEGIN
			RAISERROR(...)
			RETURN
		END
	END
	ELSE IF @DeletedCount><b>0</b> --DELETE
	BEGIN
		IF ...
		BEGIN
			RAISERROR(...)
			RETURN
		END
	END

	IF @InsertedCount><b>0</b> AND @DeletedCount><b>0</b> --UPDATE
	BEGIN
		UPDATE ...
			SET ...
			FROM Inserted, Deleted
			WHERE ...
	END
	ELSE --INSERT и DELETE
	BEGIN
		DELETE ...
			FROM Deleted
			WHERE ...
		INSERT ...
			SELECT ...
				FROM Inserted
	END
GO
Неверными действиями назовём те, которые отлавливает мой триггер и после которых происходит:
RAISERROR(...)
RETURN
В Enterprise Manager'е изменяем данные таблицы:- Когда я совершаю неверное действие по удалению или по вставке записи, то возникает только моя ошибка из одного из RAISEERROR и вылезает окно ошибки с её текстом - всё ОК.- Когда я совершаю неверное действие по изменению записи, то возникает 2 ошибки:1. Another user has modifyed the contents of this table or view; the database row you are modifying no longer exists in the database.2. Моя ошибка из RAISEERROR.Всё это в одном окне ошибки.Во всех случаях триггер работает верно.Вопросы:1. Почему вылезает первая ошибка и нормально ли это?2. Почему "Another user", а не я сам, т.к. все действия выполняются только из моей учётной записи.
6 ответов

6AP6APblCKA

Кстати, может ещё подскажите, возможна ли отмена, например, удаления из триггера AFTER DELETE без использования ROLLBACK.


6AP6APblCKA

Кстати, может ещё подскажите, возможна ли отмена, например, удаления из триггера AFTER DELETE без использования ROLLBACK.
Попробуйте в триггере вставить все записи из deleted обратно в таблицу, но имейте ввиду, что indentity столбец получит иные значения и т.п. Хотя зачем это нужно?


6AP6APblCKA

Попробуйте в триггере вставить все записи из deleted обратно в таблицу, но имейте ввиду, что indentity столбец получит иные значения и т.п. Хотя зачем это нужно?
Вставить назад я догадался, но я имел ввиду, можно ли отменить какой-либо командой, например в RAISERROR'е поставить уровень какой-нибудь такой, что отменится само.А что насчёт 2-х ошибок, ни у кого не было такого? Я не уверен, что это проблема, может так и должно быть, если это так, то напишите, что так и должно быть.


6AP6APblCKA

SET NOCOUNT ON
в начало триггера.


6AP6APblCKA

А что насчёт 2-х ошибок, ни у кого не было такого? Я не уверен, что это проблема, может так и должно быть, если это так, то напишите, что так и должно быть.
Ошибка "Another user has modifyed the contents of this table or view; the database row you are modifying no longer exists in the database." является ошибкой продвинутых _клиентских_ приложений, которые в бэкграунде совершают свои действия для переотображения измененной записи. Какие именно это действия можно увидеть в Profiler-е.


6AP6APblCKA

в начало триггера.
Ничего не изменилось, а что должно было?