我有以下情况(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。
关于sql-server - 带有外键的 SQL Server 触发器表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4178187/