nahemoth 10 Geschrieben 23. August 2011 Melden Teilen Geschrieben 23. August 2011 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! Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 23. August 2011 Melden Teilen Geschrieben 23. August 2011 Moin, du musst auf die virtuelle Tabelle "Inserted" zugreifen. Gruß, Nils Zitieren Link zu diesem Kommentar
nahemoth 10 Geschrieben 23. August 2011 Autor Melden Teilen Geschrieben 23. August 2011 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! Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 23. August 2011 Melden Teilen Geschrieben 23. August 2011 Moin, SQL arbeitet immer mengenbasiert (bei jedem Datenbankserver). Die Auswahl der Menge musst du selbst festlegen. Gruß, Nils Zitieren Link zu diesem Kommentar
nahemoth 10 Geschrieben 23. August 2011 Autor Melden Teilen Geschrieben 23. August 2011 Die Auswahl der Menge musst du selbst festlegen. Wie meinst du das? Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 23. August 2011 Melden Teilen Geschrieben 23. August 2011 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 Zitieren Link zu diesem Kommentar
hh2000 10 Geschrieben 9. September 2011 Melden Teilen Geschrieben 9. September 2011 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 Zitieren Link zu diesem Kommentar
nahemoth 10 Geschrieben 9. September 2011 Autor Melden Teilen Geschrieben 9. September 2011 Alles klar, das funktioniert soweit, Danke! Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 9. September 2011 Melden Teilen Geschrieben 9. September 2011 Moin, INSERT .. SELECT hmpf, natürlich, danke für die Korrektur. Gruß, Nils Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.