INSERT-Trigger in SQL Server 2005 - Verweis auf neu eingefügte Zeile

peejay

New Member
Hallo!

Ich brauche für SQL Server 2005 eine Möglichkeit bei einem INSERT-Trigger die neu eingefügte Zeile zu referenzieren.
Grund: In einer Tabelle T1 wird ein Eintrag gemacht, wenn eine Person einen Platz in einem Kurs erhalten hat. Wenn also eine Person einen Platz in Kurs A erhält (= INSERT), dann möchte ich die Teilnehmerzahl in der Tabelle T2 - in der die Informationen zu Kursen gespeichert sind - entsprechend um eins erhöhen.
Dazu benötige ich aber natürlich einen Möglichkeit bei der aktuell eingefügten Zeile herauszufinden, dass die Person eben einen Platz in Kurs A erhalten hat und nicht in irgendeinem anderen Kurs.

In Oracle funktioniert das in etwa so:
CREATE TRIGGER <trigger_name>

AFTER INSERT ON <table_name>

REFERENCING NEW AS <new_row_name>

FOR EACH ROW [WHEN (<trigger_condition>)]]

<trigger_body>

Weiß jemand, wie man sowas in SQL Server 2005 macht?:confused:

Viele Grüße,
Peejay
 
Hallo peejay,

der SQL-Server bietet die Variable @@Identity, um die ID des zuletzt eingefügten Datensatzes zu ermitteln.

Aus der MSDN-Lib:

Code:
@@IDENTITY
Returns the last-inserted identity value.

Syntax
@@IDENTITY

Return Types
numeric

Remarks
After an INSERT, SELECT INTO, or bulk copy statement completes, @@IDENTITY contains the last identity value generated by the statement. If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL. If multiple rows are inserted, generating multiple identity values, @@IDENTITY returns the last identity value generated. If the statement fires one or more triggers that perform inserts that generate identity values, calling @@IDENTITY immediately after the statement returns the last identity value generated by the triggers. If a trigger is fired after an insert action on a table that has an identity column, and the trigger inserts into another table that does not have an identity column, @@IDENTITY will return the identity value of the first insert. The @@IDENTITY value does not revert to a previous setting if the INSERT or SELECT INTO statement or bulk copy fails, or if the transaction is rolled back.

@@IDENTITY, SCOPE_IDENTITY, and IDENT_CURRENT are similar functions in that they return the last value inserted into the IDENTITY column of a table. 

@@IDENTITY and SCOPE_IDENTITY will return the last identity value generated in any table in the current session. However, SCOPE_IDENTITY returns the value only within the current scope; @@IDENTITY is not limited to a specific scope.

IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT returns the identity value generated for a specific table in any session and any scope. For more information, see IDENT_CURRENT.

The scope of the @@IDENTITY function is the local server on which it is executed. This function cannot be applied to remote or linked servers. To obtain an identity value on a different server, execute a stored procedure on that remote or linked server and have that stored procedure, which is executing in the context of the remote or linked server, gather the identity value and return it to the calling connection on the local server.

Examples
This example inserts a row into a table with an identity column and uses @@IDENTITY to display the identity value used in the new row.

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'

Vielleicht hilfts,

Marcel
 
Last edited by a moderator:
Hallo!

Vielen Dank Marcel! Inzwischen hab' ich was anderes gefunden.

Der Trigger funktioniert einwandfrei und sieht jetzt so aus:
Code:
SET ANSI_NULLS ON
USE Anmeldesystem;
GO
CREATE TRIGGER incrementAnzVergeben
ON [Anmeldesystem].[dbo].[Hat_Platz]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @Nummer int
SELECT @Nummer = inserted.[Gruppe] FROM inserted

IF @Nummer IS NOT NULL
BEGIN
UPDATE [Anmeldesystem].[dbo].[Gruppe]
SET [anzVergeben] = [anzVergeben] + 1
FROM inserted
WHERE inserted.Anmeldeobjekt = Gruppe.Anmeldeobjekt
AND inserted.Gruppe = Gruppe.Gruppennr;

UPDATE [Anmeldesystem].[dbo].[Anmeldeobjekt]
SET [anzVergeben] = [anzVergeben] + 1
FROM inserted
WHERE inserted.Anmeldeobjekt = Anmeldeobjekt.Id;
END

IF @Nummer IS NULL
BEGIN
UPDATE [Anmeldesystem].[dbo].[Anmeldeobjekt]
SET [anzVergeben] = [anzVergeben] + 1
FROM inserted
WHERE inserted.Anmeldeobjekt = Anmeldeobjekt.Id;
END

UPDATE [Anmeldesystem].[dbo].[Priorisierung]
SET [anzVergeben] = [anzVergeben] + 1
FROM inserted
WHERE inserted.Anmeldeobjekt = Priorisierung.Anmeldeobjekt
AND inserted.Priorisierung = Priorisierung.DurchlaufNr;

UPDATE [Anmeldesystem].[dbo].[Anmeldung]
SET [Hat_Platz] = 'True'
FROM inserted
WHERE inserted.StudIPKennung = Anmeldung.StudIPKennung
AND inserted.Anmeldeobjekt = Anmeldung.Anmeldeobjekt;
END
GO
Links auf MSDN:
Verwenden der Tabellen inserted und deleted
Trigger bei mehrzeiligen Operationen

Viele Grüße,
Peejay
 
Last edited by a moderator:
Der Vollständigkeit halber hier auch noch der Delete-Trigger (gültig für ein DELETE, das beliebig viele Zeilen betrifft):
Code:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
USE Anmeldesystem;
GO
CREATE TRIGGER decrementAnzVergeben 
   ON  [Anmeldesystem].[dbo].[Hat_Platz] 
   AFTER DELETE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	UPDATE [Anmeldesystem].[dbo].[Gruppe]
	SET [anzVergeben] = [anzVergeben] -
		(SELECT Count(*)
		 FROM deleted
		 WHERE deleted.Anmeldeobjekt = Gruppe.Anmeldeobjekt
		 AND deleted.Gruppe IS NOT NULL
		 AND deleted.Gruppe = Gruppe.Gruppennr)

	UPDATE [Anmeldesystem].[dbo].[Anmeldeobjekt]
	SET [anzVergeben] = [anzVergeben] - 
		(SELECT Count(*)
		 FROM deleted
		 WHERE deleted.Anmeldeobjekt = Anmeldeobjekt.Id)

	UPDATE [Anmeldesystem].[dbo].[Priorisierung]
	SET [anzVergeben] = [anzVergeben] - 
		(SELECT Count(*)
		 FROM deleted
		 WHERE deleted.Anmeldeobjekt = Priorisierung.Anmeldeobjekt
		 AND deleted.Priorisierung = Priorisierung.DurchlaufNr)

	UPDATE [Anmeldesystem].[dbo].[Anmeldung]
	SET [ZK_min_einmal_erfuellt] = 'False', [Hat_Platz] = 'False'
	FROM deleted
	WHERE deleted.StudIPKennung = Anmeldung.StudIPKennung
	AND deleted.Anmeldeobjekt = Anmeldung.Anmeldeobjekt

END
GO
 
Last edited by a moderator:
Back
Top