Sql server 具有外键的SQL Server触发器表

Sql server 具有外键的SQL Server触发器表,sql-server,triggers,identity,Sql Server,Triggers,Identity,我有以下情况(SQL Server Express): 通过pk fk约束连接的2个表 连接这两个表的视图 使用数据库的程序只能访问该视图 视图上插入的替代触发器 其思想是触发器将数据输入到1。table->通过IDENTITY创建一个新PK,第二个表现在必须包含1。作为主键一部分的表ID 如何访问新创建的1的PK。多连接环境中的表?这是数据库的简化/修改版本: CREATE TABLE Training ( Training_ID INT IDENTITY NOT NULL PRIMA

我有以下情况(SQL Server Express):

  • 通过pk fk约束连接的2个表
  • 连接这两个表的视图
  • 使用数据库的程序只能访问该视图
  • 视图上插入的替代触发器
其思想是触发器将数据输入到1。table->通过IDENTITY创建一个新PK,第二个表现在必须包含1。作为主键一部分的表ID

如何访问新创建的1的PK。多连接环境中的表?这是数据库的简化/修改版本:

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;
由于数据库中的其他定义,公里数ID的默认值“0”是必需的,合并这两个表不是一个选项。。。 虽然触发器似乎运行正常,但我不确定它在多用户环境中是否正常(如果另一个连接改变了表,@Identity会发生什么情况?)

有没有更好的方法来解决这个问题


Greetz Michael

如果您只关心@@Identity,请使用SCOPE_Identity(),它将返回同一作用域中最近创建的id


这里解释的差异:

如果您的方法是在单插入的低容量环境中,那么它可能会一直有效。在SQL Server中,如果使用SCOPE\u IDENTITY更好,因为它只从当前作用域获取标识


如果要同时在此视图中插入多行(例如,
insert into TrainingView select…
),这将中断,因为您需要多个TrainingID。为此,您可以使用获取该插入的所有ID。

谢谢您的链接,您对该设计还有其他问题吗?我可能只是为这两个插入存储了一个过程,但您的触发器看起来很可靠。我不确定我是否真的了解了表的内容,但只要你不介意不能像Matt解释的那样在一个语句中插入多行,结构看起来就可以了。好的,我可能已经过度简化了示例代码,在一个语句中插入多行目前并不是真的需要(至少根据当前的要求:))谢谢你的回答,我最好更新SCOPE_IDENTITY。如果我理解正确的话,无论触发器并行执行的频率有多高,或者在数据库中的其他位置更新了标识,该函数都将返回触发器创建的最后一个标识。我说得对吗?我不太清楚你到底是什么意思。SCOPE_IDENTITY()将返回特定会话插入中特定例程的最后一个标识,而不管数据库中发生了什么或调用SCOPE_IDENTITY需要多长时间。因此,如果您插入但保持窗口/连接打开,其他人插入,然后您开始调用SCOPE_IDENTITY(),您得到的是最后一个插入的ID,而不是他们的ID。