Jump to content

Prozedur über Trigger aufrufen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo,

 

ich würde gerne, wenn eine neuer Datensatz geschrieben wird eine Prozedur aufrufen und dieser den Wert von Feld1 übergeben.

Mein Ansatz:

ON Table1
FOR INSERT
AS
DECLARE @Benutzer char
SET @Benutzer = :NEW.Benutzer
BEGIN
IF @Benutzer = "User1" OR @Benutzer = "User2"  THEN 
	EXECUTE dbo.MailVersand(@Benutzer)
END IF;
END

Er lässt mich aber über :NEW.Benutzer nicht auf das Feld Benutzer des neuen Datensatzes zugreifen.

 

Wie muss dies bei MSSQL 2005 richtig definiert werden?

 

Vielen Dank für die Hilfe!

Link zu diesem Kommentar

Alles klar, also

ALTER TRIGGER [benachrichtigung]
ON dbo.zugriffe
FOR INSERT
AS
DECLARE @Benutzer char
SET @Benutzer = (SELECT Benutzer FROM inserted)

und dann um bei einem Bestimmten Namen eine Prozedur aufzurufen:

BEGIN
IF @Benutzer = "Benutzer1" THEN 
	EXECUTE dbo.MailVersand(@Benutzer)
END IF;
END

hierbei wird dann der Benutzername an die Prozedur übergeben, richtig?

 

FOR EACH gibt es ja beim MSSQL nicht habe ich gelesen, führt er dann die Anweisung für jeden gefundenen Datensatz durch?

 

Vielen Dank!

Link zu diesem Kommentar

Moin,

 

SQL-Kommandos beziehen sich immer auf ein Resultset. Machst du also z.B. ein UPDATE oder ein DELETE, dann betrifft das immer alle Reihen, die von deinem Filterstatement zurückgegeben werden. Willst du nur einzelne Reihen bearbeiten, dann musst du sie per Filter ausdrücklich auswählen.

 

Auch bei einem Trigger kann das zutreffen, etwa bei UPDATE- oder DELETE-Triggern. In dem Fall haben die virtuellen Tabellen mehr als eine Reihe. Bei INSERT dürfte es sich aber immer nur um eine Zeile handeln, der Trigger wird also für jede eingefügte Reihe neu aufgerufen.

 

Gruß, Nils

Link zu diesem Kommentar
  • 3 Wochen später...

Hallo,

Bei INSERT dürfte es sich aber immer nur um eine Zeile handeln, der Trigger wird also für jede eingefügte Reihe neu aufgerufen.

 

Kleine Korrektur, der Insert-Trigger arbeitet genauso wie der Update- und Delete-Trigger, also mengenbasiert:

 

INSERT INTO Tabelle1 (SpalteA, SpalteB)

SELECT SpalteA, SpalteB

FROM Tabelle2

Hier wird der Trigger nur einmal ausgelöst.

 

 

Das funktioniert so nicht wie gewünscht:

SET @Benutzer = (SELECT Benutzer FROM inserted)

 

Generell beim Trigger immer beachten:

 

a) Es wird kein Datensatz zurückgeliefert (@Benutzer wäre dann NULL)

b) Es wird genau EIN Datensatz geliefert (@Benutzer = 'ABC', Super, Programm funktioniert)

c) Es werden mehrere Datensätze geliefert (@Benutzer = ?? )

 

Daher muss Dein Programm diese Fäle alle abdecken können, sonst geht es schief.

 

Gruß Kai

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...