AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 212662
Accepted
SHR
SHR
Asked: 2018-07-20 06:14:02 +0800 CST2018-07-20 06:14:02 +0800 CST 2018-07-20 06:14:02 +0800 CST

Inserir na exibição de várias tabelas no SQL SERVER

  • 772

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?

sql-server view
  • 1 1 respostas
  • 4023 Views

1 respostas

  • Voted
  1. Best Answer
    EzLo
    2018-07-20T06:27:46+08:002018-07-20T06:27:46+08:00

    Você só pode fazer isso (o gatilho é irrelevante) ao inserir em uma visão particionada , que é uma visão que pode UNION ALLdados nas quais as tabelas subjacentes têm CHECKrestrições apropriadas que são desarticuladas com a primary key, portanto INSERT, inconfundivelmente, uma tabela subjacente.


    Seguindo seu exemplo, se você restringir alguns valores para table A, outros para table Be adicionar uma chave primária composta:

    Create table A(
        [id] int, 
        value nvarchar(50), 
        CHECK (value = 'A'),
        PRIMARY KEY (ID, value))
    
    Create table B(
        [id] int, 
        value nvarchar(50), 
        CHECK (value = 'B'),
        PRIMARY KEY (ID, value))
    

    A vista continua a mesma:

    create View V as (select id, value from A) UNION ALL (select id, value from B)
    

    E agora você pode inserir com sucesso diretamente na visualização (sem necessidade de gatilho):

    insert into v (id, value) select 1,'B' 
    -- (1 row(s) affected)
    

    Existe uma maneira de decidir (sem alterar o gatilho) qual é a tabela padrão da exibição de maneira a inserir nela?

    Inserindo com value = 'B'correspondênciasCHECK tabela for B(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 CHECKrestrição...

    insert into v (id, value) select 1,'C' 
    --Msg 4457, Level 16, State 1, Line 1
    --The attempted insert or update of the partitioned view failed because the value of the partitioning column does not belong to any of the partitions.
    --The statement has been terminated.
    

    Verifique o DDL das tabelas em que a inserção da sua visualização funciona e você verá as CHECKrestrições desarticuladas.

    • 5

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve