我有一系列可更新的视图,我们向最终用户公开,作为后端流程的接口。
其中一个视图引用了两个表,并且需要INSTEAD OF
触发器UPDATE
和INSERT
s。
表格的结构是(大大简化):
Claim
(DataRowID bigint IDENTITY PRIMARY KEY
,<bunch of claim data>)
ClaimExtended
(ClaimDataRowID bigint FOREIGN KEY references dbo.Claim(DataRowID) NOT NULL
,<bunch of other claim data>)
我最初的计划是在触发器中这样做:
CREATE TRIGGER [dbo].[MyTrigger] ON [dbo].[MyView]
INSTEAD OF INSERT
AS
DECLARE @IDLink TABLE
(RowID int
,ClaimDataRowID bigint)
DECLARE @Inserted TABLE
(RowID int identity (1,1) NOT NULL
,<all the columns from the view>)
INSERT INTO
@Inserted
(<View columns>)
SELECT
(<View columns>)
FROM
Inserted
INSERT INTO
Claim
(<Columns>)
OUTPUT
I.RowID
,inserted.ClaimDataRowID
INTO
@IDLink (RowID, ClaimDataRowID)
SELECT
(<Columns>)
FROM
@Inserted I
INSERT INTO
ClaimExtended
(ClaimDataRowID,
<Columns>)
SELECT
C.ClaimDataRowID,
<Columns>
FROM
@Inserted I
INNER JOIN
@IDLink C
ON C.RowID = I.RowID
这里的OUTPUT
子句不起作用,但是(Multi-part identifier I.RowID could not be bound
)我假设是因为我无法在INSERT
OUTPUT
子句中引用源表。
除了使视图成为表格之外,我还可以在这里使用什么其他方法?由于其他原因,这需要是 aVIEW
并且基础表几乎是一成不变的。
表:
看法:
代替触发器:
示例用法:
输出: