代码之家  ›  专栏  ›  技术社区  ›  MFH

带外键的SQL Server触发器表

  •  2
  • MFH  · 技术社区  · 15 年前

    我遇到以下情况(SQL Server Express):

    • 通过pk-fk约束连接的两个表
    • 连接这两个表的视图
    • 使用数据库的程序只能访问视图
    • 视图上插入的instead of触发器

    其思想是触发器将数据输入1。表->通过标识创建新主键,第二个表现在必须包含1。表的ID作为主键的一部分。。。

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

    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会发生什么情况?)

    有没有更好的解决办法?

    格里茨·迈克尔

    2 回复  |  直到 15 年前
        1
  •  2
  •   jon_darkstar    15 年前

    如果只关心@@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/

        2
  •  0
  •   Matt    15 年前

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

    如果要一次在此视图中插入多行(例如。, insert into TrainingView select ... )因为你需要一个以上的训练ID,所以这会中断。对于这个,你可以使用 SQL Server's OUTPUT clause 把你所有的身份证都拿来。