aus Trigger Prozedur aufrufen, welche die neue Zeile braucht

08/03/2009 - 02:50 von Lutz Elßner | Report spam
Aus einem AFTER INSERT Trigger rufe ich eine Prozedur auf,
die auf die soeben hinzugefügte Zeile, die den Trigger ausgelöst hat,
zugreifen will. Die Zeile scheint aber noch nicht vorhanden zu sein,
im Trigger in inserted ist sie aber vorhanden.

Kann ich im Trigger veranlassen, dass die inserted Row schon in
die Tabelle geschrieben wird, bevor ich die Prozedur aufrufe?

Oder geht das irgendwie anders?

Lutz
 

Lesen sie die antworten

#1 Elmar Boye
08/03/2009 - 09:32 | Warnen spam
Hallo Lutz,

"Lutz Elßner" <www.vb-hosting.de> schrieb ...
Aus einem AFTER INSERT Trigger rufe ich eine Prozedur auf,
die auf die soeben hinzugefügte Zeile, die den Trigger ausgelöst hat,
zugreifen will. Die Zeile scheint aber noch nicht vorhanden zu sein,
im Trigger in inserted ist sie aber vorhanden.



Die Zeile ist in der Tabelle vorhanden, wenn der Insert Trigger
ausgeführt wird.

Kann ich im Trigger veranlassen, dass die inserted Row schon in
die Tabelle geschrieben wird, bevor ich die Prozedur aufrufe?



Da dürfte ein Problem mit der Übergabe bestehen.
Unten mal ein simples Muster.

Gruß Elmar





CREATE TABLE dbo.Tabelle (
id int identity(1,1) not null primary key,
daten nvarchar(40) not null);
GO

CREATE PROC dbo.TabelleProc
@id int
AS
IF EXISTS (SELECT * FROM dbo.Tabelle WHERE id = @id)
SELECT 'GEFUNDEN!', id, daten
FROM dbo.Tabelle WHERE id = @id
ELSE
SELECT 'NICHT GEFUNDEN!', @id
GO

CREATE TRIGGER TR_Tabelle_Insert
ON dbo.Tabelle
FOR INSERT
AS
SET NOCOUNT ON

DECLARE @id int
DECLARE InsertCursor CURSOR LOCAL STATIC
FOR SELECT id FROM inserted

OPEN InsertCursor
FETCH InsertCursor INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.TabelleProc @id
FETCH InsertCursor INTO @id
END
CLOSE InsertCursor
DEALLOCATE InsertCursor
GO

INSERT INTO dbo.Tabelle (daten) VALUES ('1. Zeile')
INSERT INTO dbo.Tabelle (daten) VALUES ('2. Zeile')
INSERT INTO dbo.Tabelle (daten)
SELECT daten + N' als Kopie' FROM dbo.Tabelle

GO

DROP TABLE dbo.Tabelle
DROP PROC dbo.TabelleProc
GO

Ähnliche fragen