Tenho uma série de exibições atualizáveis que estamos expondo aos usuários finais como a interface para um processo de back-end.
Uma dessas exibições faz referência a duas tabelas e requer um INSTEAD OF
gatilho para UPDATE
e INSERT
s.
A estrutura das tabelas é (bastante simplificada):
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>)
Meu plano original era fazer isso no gatilho da seguinte forma:
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
A OUTPUT
cláusula aqui não está funcionando, no entanto ( Multi-part identifier I.RowID could not be bound
) estou assumindo porque não consigo referenciar a tabela de origem em uma INSERT
OUTPUT
cláusula.
Que outro método eu poderia usar aqui além de tornar a view uma tabela? Por outras razões, isso precisa ser um VIEW
e as tabelas subjacentes são praticamente imutáveis.
Tabelas:
Visão:
Em vez de gatilho:
Exemplo de uso:
Resultado: