Fehler in Trigger

wolfmaYer

Grünschnabel
Hi, ich habe irgendwie ein Brett vorm Kopf...
Ich habe mir extra ein Testszenario aufgebaut, so dass ich bei diesem einen Fehler zurück bekommen sollte und nix ist, der fügt munter Einträge ein.

Ich muss dazu sagen, dass es mein erster triger ist, den ich schreibe und jetzt möchte ich Euch fragen, ob ich irgendetwas übersehen oder nicht beachtet habe.

Vielen Dank für eure Mühe, maYer


Code:
ALTER TRIGGER [TR_OBJECT_LOCKING_INSTEAD_OF_INSERT]
   ON  [OBJECT_LOCKING] 
   INSTEAD OF INSERT
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	-- Insert statements for trigger here
	/*	Trigger um zu prüfen, ob ein Benutzer dieses Objekt 
		schon im Zugriff hat. Ist dies nicht der Fall,
		kann das Objekt angelegt werden.*/

	--Die Variablen declarieren.
	DECLARE @USER int
	DECLARE @OPERATION smallint
	DECLARE @CLASS smallint
	DECLARE @OBJECT int

        --Die Variablen aus Inserted füllen.
	SELECT 
		@USER=USER_OBJECT_ID, 
		@OPERATION=LOCK_TYPE, 
		@CLASS=OPER_CLASS_ID,
		@OBJECT=OPER_CLASS_ID
	FROM inserted
	
	--Nachfragen, ob das Objekt von einem anderen Benutzer gesperrt wurde
	IF EXISTS
		(
			SELECT * FROM OBJECT_LOCKING 
			WHERE OPER_CLASS_ID = @CLASS 
			AND OPER_OBJECT_ID = @OBJECT 
			AND USER_OBJECT_ID != @USER
		)
	BEGIN
		--Abfragen, ob der Benutzer Administrationsrechte hat.
		IF NOT EXISTS
			(
				SELECT * FROM USER_AUTH 
				WHERE USER_AUTH.USR_OBJECT_ID = @USER
				AND USER_AUTH.OPERATION_ID = 15
			)
		BEGIN
			
			--Abfragen, ob der Benutzer in einer Gruppe mit Administrationsrechten ist.
			IF NOT EXISTS
				(
					SELECT * FROM USER_AUTH 
					INNER JOIN USER_GROUP 
					ON USER_GROUP.GRP_OBJECT_ID = USER_AUTH.GRP_OBJECT_ID 
					WHERE USER_GROUP.USR_OBJECT_ID = @USER
					AND USER_AUTH.OPERATION_ID = 15
				)
			RAISERROR('Der Benutzer kann die Operation nicht ausführen, da ein anderer Benutzer das Objekt geblockt hat', --Fehlermeldung
					  15, --Schweregrad des Fehlers.
					  2)  --Status. Dient zur Unterscheidung der selben Fehlermeldung an verschiedenen Stellen.
					  --WITH NOWAIT --Fehlermeldung soll sofort ausgegeben werden.
		END
	END
	
	
	--Die Zeile in die Tabelle einfügen.
	INSERT INTO OBJECT_LOCKING
	(
		OBJECT_ID, 
		CLASS_ID, 
		OPER_OBJECT_ID, 
		OPER_CLASS_ID, 
		LOCK_TYPE, 
		STATE, 
		CREATION_DATE, 
		USER_OBJECT_ID, 
		USER_ID_MOD, 
		MODIFICATION_DATE, 
		TDM_CTRL_CLASS_ID, 
		TDM_CTRL_OBJ_ID
	)
	SELECT
		OBJECT_ID, 
		CLASS_ID, 
		OPER_OBJECT_ID, 
		OPER_CLASS_ID, 
		LOCK_TYPE, 
		STATE, 
		CREATION_DATE, 
		USER_OBJECT_ID, 
		USER_ID_MOD, 
		MODIFICATION_DATE, 
		TDM_CTRL_CLASS_ID, 
		TDM_CTRL_OBJ_ID
	FROM 
	inserted
	
END
 
Also, man kann ja bekanntlich bei einem Problem nicht die Finger davon lassen, bis es endlich gelöst ist, habe ich die Sache mal eingegrenzt.

Es funktioniert selbst dieser trigger nicht, wie er soll:
Code:
ALTER TRIGGER [TR_OBJECT_LOCKING_INSTEAD_OF_INSERT]
   ON  [OBJECT_LOCKING] 
   INSTEAD OF INSERT
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
        RAISERROR('Der Benutzer kann die Operation nicht ausführen, da ein anderer Benutzer das Objekt geblockt hat', --Fehlermeldung
                15, --Schweregrad des Fehlers.
                2)  --Status. Dient zur Unterscheidung der selben Fehlermeldung an verschiedenen Stellen.
                WITH NOWAIT --Fehlermeldung soll sofort ausgegeben werden.
                --Die Zeile in die Tabelle einfügen.
	INSERT INTO OBJECT_LOCKING
	(
		OBJECT_ID, 
		CLASS_ID, 
		OPER_OBJECT_ID, 
		OPER_CLASS_ID, 
		LOCK_TYPE, 
		STATE, 
		CREATION_DATE, 
		USER_OBJECT_ID, 
		USER_ID_MOD, 
		MODIFICATION_DATE, 
		TDM_CTRL_CLASS_ID, 
		TDM_CTRL_OBJ_ID
	)
	SELECT
		OBJECT_ID, 
		CLASS_ID, 
		OPER_OBJECT_ID, 
		OPER_CLASS_ID, 
		LOCK_TYPE, 
		STATE, 
		CREATION_DATE, 
		USER_OBJECT_ID, 
		USER_ID_MOD, 
		MODIFICATION_DATE, 
		TDM_CTRL_CLASS_ID, 
		TDM_CTRL_OBJ_ID
	FROM 
	inserted
	
END

Nach meinem Verständniss sollte das Insert-Statement nicht ausgeführt werden sondern es sollte die Fehlermeldung ausgegeben werden.

Wieso?
Weiß da jemand genaueres?

zur Info:
Ich arbeite mit einem MSSQL 2005 Express

Gruß, maYer
 
Zurück