首页 > 解决方案 > SQL Server - 使用 VIEW 更新多个基表

问题描述

我有一个“基”表,我希望用“自定义”字段扩展它——但我不想改变基表的完整性(只需将我的自定义列添加到它)。以下是表定义:

CREATE TABLE CHRIS_BASE (
    ID      UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(),
    B1      VARCHAR(20),
    B2      VARCHAR(20)
    PRIMARY KEY(ID)
)


CREATE TABLE CHRIS_CUSTOM (
    ID          UNIQUEIDENTIFIER NOT NULL FOREIGN KEY REFERENCES dbo.CHRIS_BASE(ID) ON DELETE CASCADE,
    C1          VARCHAR(20),
    C2          VARCHAR(20)
    PRIMARY KEY (ID) 
)

为了获得所有相关数据的单一视图,我创建了一个视图:

CREATE VIEW CHRIS_VW AS
    SELECT cb.ID, cb.B1, cb.B2, cc.C1, cc.C2
    FROM dbo.CHRIS_BASE AS cb
    LEFT OUTER JOIN dbo.CHRIS_CUSTOM AS cc ON cc.ID = cb.ID

我将如何创建“INSTEAD OF”触发器来处理这个问题?最重要的事情显然是在我执行插入时键匹配。我试过这个:

CREATE TRIGGER CHRIS_VW_TR_INSERT ON CHRIS_VW
INSTEAD OF INSERT
AS
BEGIN

    INSERT INTO dbo.CHRIS_BASE (B1, B2)
    SELECT B1, B2
    FROM INSERTED

    INSERT INTO dbo.CHRIS_CUSTOM (C1, C2)
    SELECT C1, C2
    FROM INSERTED

END

但我显然遇到了一个错误 - 因为我无法将生成的 ID 从“基本”表带到“自定义”表。

INSERT INTO CHRIS_VW
    (B1, B2, C1, C2)
VALUES
    ('R1-F1-BASE','R1-F2-BASE','R1-F1-CUSTOM','R1-F2-CUSTOM'),
    ('R2-F1-BASE','R2-F2-BASE','R2-F1-CUSTOM','R2-F2-CUSTOM'),
    ('R3-F1-BASE','R3-F2-BASE','R3-F1-CUSTOM','R3-F2-CUSTOM'),
    ('R4-F1-BASE','R4-F2-BASE','R4-F1-CUSTOM','R4-F2-CUSTOM')

产量:

(4 rows affected)
Msg 515, Level 16, State 2, Procedure CHRIS_VW_TR_INSERT, Line 10 [Batch Start Line 43]
Cannot insert the value NULL into column 'ID', table 'AAD.dbo.CHRIS_CUSTOM'; column does not allow nulls. INSERT fails.
The statement has been terminated.

也在寻找 UPDATE 和 DELETE 触发器的方向。

标签: sqlsql-servertsql

解决方案


使用该OUTPUT子句,但它变得复杂。如果我们假设B1/B2在加载数据时是唯一的:

BEGIN
    DECLARE @ids TABLE (@id UNIQUEIDENTIFIER);

    INSERT INTO dbo.CHRIS_BASE (B1, B2)
        SELECT B1, B2
        FROM INSERTED
        OUTPUT id INTO @ids;

    INSERT INTO dbo.CHRIS_CUSTOM (ID, C1, C2)
        SELECT ids.id, i.C1, i.C2
        FROM INSERTED i JOIN
             @ids ids
             ON i.B1 = ids.B1 AND i.B2 = ids.B2;
END;

推荐阅读