Estou fazendo essa pergunta de forma a tentar entender uma situação semelhante que tenho, e tentar entender como está funcionando o insert to view.
Eu tenho essas tabelas:
Create table A([id] int primary key not null, value nvarchar(50) NULL)
Create table B([id] int primary key not null, value nvarchar(50) NULL)
E eu crio view das duas tabelas assim:
create View V as (select * from A) UNION ALL (select * from B)
E eu tenho esse gatilho na visualização V:
Create trigger v_trig on V instead of insert AS
insert into v (id,value) select id,value from inserted
Quando tento inserir na minha view, estou recebendo o seguinte erro:
Msg 4436, Nível 16, Estado 12, Procedimento v_trig, Linha 2
A exibição UNION ALL 'db.dbo.V' não é atualizável porque uma coluna de particionamento não foi encontrada
Eu tenho um banco de dados com uma visão semelhante (com union all
) e por algum motivo consigo inserir nele sem nenhum problema e estou tentando entender o porquê.
O que devo fazer para permitir a inserção em tal visualização? Existe uma maneira de decidir (sem alterar o gatilho) qual é a tabela padrão da exibição de maneira a inserir nela?
Você só pode fazer isso (o gatilho é irrelevante) ao inserir em uma visão particionada , que é uma visão que pode
UNION ALL
dados nas quais as tabelas subjacentes têmCHECK
restrições apropriadas que são desarticuladas com aprimary key
, portantoINSERT
, inconfundivelmente, uma tabela subjacente.Seguindo seu exemplo, se você restringir alguns valores para table
A
, outros para tableB
e adicionar uma chave primária composta:A vista continua a mesma:
E agora você pode inserir com sucesso diretamente na visualização (sem necessidade de gatilho):
Inserindo com
value = 'B'
correspondênciasCHECK
tabela forB
(a coluna particionada), de modo que a linha segue dessa maneira automaticamente. Como a coluna marcada deve fazer parte da chave primária, o mecanismo SQL sabe que essa linha pertence a esta tabela e não a nenhuma outra, pois todas possuem chaves primárias com a mesma coluna e valores de verificação diferentes. Você não pode controlar isso manualmente.Se você tentar inserir um valor que não seja compatível com nenhuma
CHECK
restrição...Verifique o DDL das tabelas em que a inserção da sua visualização funciona e você verá as
CHECK
restrições desarticuladas.