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

Geschrieben

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!

Geschrieben

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!

Geschrieben

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

  • 3 Wochen später...
Geschrieben

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

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

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...