sql - 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 触发器的方向。
解决方案
使用该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;
推荐阅读
- windows - 如何检查文件扩展名?
- mysql - MYSQL如何将当前余额查询为以前的余额
- jmeter - Jmeter 结果未发布到仪表板
- c# - uwp C#中其他页面的图像突出显示信息
- asp.net-mvc - Bootstrap textarea 显示 html 和阻止按钮
- python - 在 python docker 映像上安装 simstring (SWIG)
- javascript - Facebook Graph API - 获取用户共享的帖子覆盖率
- javascript - 爬取javascript表但认为是异常请求
- regex - 排除正则表达式中特殊字符 # 和 # 之后的所有字符的匹配
- node.js - 使用 Axios POST 时未定义的结果