I have the following situation (SQL Server Express):
- 2 tables connected via a pk-fk constraint
- a view that joins these two tables
- the program to use the database only has access to the view
- an instead of trigger for inserts on the view
The idea is that the trigger enters data into the 1. table -> a new PK is created via IDENTITY, the second table now has to contain the 1. table’s ID as part of it’s primary key…
How can I access the newly created PK of the 1. table in a multi-connection-environment? This is a simplified/modifed version of the database:
CREATE TABLE Training (
Training_ID INT IDENTITY NOT NULL PRIMARY KEY,
Name NVARCHAR(30) NOT NULL);
CREATE TABLE Kilometer (
Training_ID INT NOT NULL REFERENCES Training(Training_ID),
Kilometer_ID INT NOT NULL,
Timestamp DATETIME NOT NULL,
PRIMARY KEY(Training_ID, Kilometer_ID);
CREATE VIEW TrainingView (
SELECT t.Name, k.Timestamp
FROM Training t LEFT JOIN Kilometer k ON (t.Training_ID = k.Training_ID));
CREATE TRIGGER TrainingTrigger ON TrainingView INSTEAD OF INSERT AS BEGIN
INSERT INTO Training(Name) SELECT Name FROM inserted;
INSERT INTO Kilometer(Training_ID, Kilometer_ID, Timestamp) SELECT @@Identity, 0, Timestamp FROM inserted;
END;
The default ‘0’ for Kilometer_ID is mandatory due to other definitions in the database, merging these two tables is not an option…
While the Trigger seems to function right, I’m not sure if it will in a multi-user environment (what happens to @@Identity, if another connection alters the table?)
Is there a better solution to this trigger?
Greetz Michael
If your concern with @@Identity is the only issue use SCOPE_IDENTITY() , which returns the most recently created id FROM THE SAME SCOPE.
Differences explained here: http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/