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 / 161309
Accepted
David
David
Asked: 2017-01-18 04:07:32 +0800 CST2017-01-18 04:07:32 +0800 CST 2017-01-18 04:07:32 +0800 CST

Renomeando a tabela e colocando uma view em seu lugar no Postgres

  • 772

Eu tenho uma tabela bem central em nosso banco de dados que é utilizada por uma série de aplicações, ela possui regras atreladas a ela, triggers e todas as dependências que você possa imaginar. Agora gostaria de modificar a tabela sem causar problemas nas dependências. Anteriormente, consegui fazer o seguinte, mas em um caso muito menos complexo:

alter table reconciliations rename to matches;
create view reconciliations as select * from matches;

O que isso significa é que agora eu poderia modificar a nova tabela "correspondências" e, por exemplo, adicionar uma coluna ou linhas, que não precisam ser apresentadas na exibição "reconciliações" (adicionando uma cláusula where para filtrá-las).

Estou no Postgres 9.5, então a visualização é atualizável automaticamente. Os testes iniciais mostram que não há problemas imediatos com isso, então estou fazendo esta pergunta para saber que tipo de problema devo procurar. O desempenho não é um grande problema.

postgresql migration
  • 1 1 respostas
  • 2011 Views

1 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2017-01-18T07:43:10+08:002017-01-18T07:43:10+08:00

    Se você fizer isso em produção, fique atento às instruções preparadas . Esses já foram analisados, reescritos (e o plano de consulta armazenado em cache). O efeito é ativado até que as instruções preparadas sejam desalocadas (o que pode levar muito tempo).

    Para verificar declarações preparadas (somente da mesma sessão!):

    TABLE pg_prepared_statements;
    

    O efeito também se estende às funções plpgsql que lidam com comandos SQL como instruções preparadas internamente.

    Normalmente, as instruções preparadas são forçadas a serem replanejadas após qualquer alteração nos objetos envolvidos. Mas suas ações contornam esse mecanismo de segurança.

    Além disso, a maioria das consultas continuará funcionando. Mas nem todos.

    Demonstração

    CREATE TEMP TABLE foo (id int);
    INSERT INTO foo VALUES (4);
    PREPARE x AS SELECT foo FROM foo WHERE id > $1;  -- uses row type
    

    Isso funciona:

    ALTER TABLE foo ADD COLUMN t text;
    EXECUTE x(3);  -- automatically re-planned
    

    Mas isso não :

    ALTER TABLE foo RENAME TO foo1;
    CREATE VIEW foo AS TABLE foo1;
    ALTER TABLE foo1 ADD COLUMN t text;
    
    EXECUTE x(3);  -- not re-planned!
    
    ERROR:  cached plan must not change result type
    

    O manual sobre PREPARE:

    Embora o ponto principal de uma instrução preparada seja evitar a análise de análise repetida e o planejamento da instrução, o PostgreSQL forçará a reanálise e o replanejamento da instrução antes de usá-la sempre que os objetos do banco de dados usados ​​na instrução tiverem sofrido alterações de definição (DDL). desde o uso anterior da instrução preparada. Além disso, se o valor de search_pathmudar de um uso para outro, a instrução será reanalisada usando o novosearch_path. (Este último comportamento é novo no PostgreSQL 9.3.) Essas regras fazem uso de uma instrução preparada semanticamente quase equivalente a reenviar o mesmo texto de consulta repetidamente, mas com um benefício de desempenho se nenhuma definição de objeto for alterada, especialmente se o melhor plano permanece o mesmo em todos os usos. Um exemplo de caso em que a equivalência semântica não é perfeita é que, se a instrução se referir a uma tabela por um nome não qualificado e, em seguida, uma nova tabela com o mesmo nome for criada em um esquema que aparece anteriormente no search_path, nenhuma reanálise automática ocorrerá, pois nenhum objeto usado na instrução foi alterado. No entanto, se alguma outra alteração forçar uma nova análise, a nova tabela será referenciada em usos subsequentes.

    O exemplo acima é outro em que a "equivalência semântica não é perfeita" .

    • 6

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

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