sql-server - 带有外键的 SQL Server 触发器表

标签 sql-server triggers identity

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

  • 2 个表通过 pk-fk 约束连接
  • 连接这两个表的 View
  • 使用数据库的程序只能访问 View
  • 用于在 View 中插入的代替触发器

想法是触发器将数据输入 1. 表 -> 通过 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;

由于数据库中的其他定义,Kilometer_ID 的默认“0”是强制性的,合并这两个表不是一个选项... 虽然触发器似乎运行正常,但我不确定它是否会在多用户环境中运行(如果另一个连接更改了表,@@Identity 会发生什么情况?)

这个触发器有没有更好的解决方案?

问候迈克尔

最佳答案

如果您对 @@Identity 的关注是唯一的问题,请使用 SCOPE_IDENTITY() ,它会从同一范围返回最近创建的 ID。

此处解释差异:http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

关于sql-server - 带有外键的 SQL Server 触发器表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4178187/

相关文章:

sql-server - 创建身份列需要多长时间?

MySql 触发器 INSERT...ON DUPLICATE KEY UPDATE 无法识别列

MySQL 在插入前触发时更改类型

C# 将 MS Access 数据库同步到 sql server

sql - 分区 SQL Server 中的数据类型更改

mysql - WHERE 子句与 SET 和 UPDATE 子句

identity - 使用刷新 token 时出现 Invalid_Grant 错误

sql - 如何获取新插入或已经存在的记录的标识值?

sql - 在 Sybase ASE 中插入多行

sql - 选择 ID、计数 (ID) 和按日期分组