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 / 323413
Accepted
ConanTheGerbil
ConanTheGerbil
Asked: 2023-02-13 05:37:33 +0800 CST2023-02-13 05:37:33 +0800 CST 2023-02-13 05:37:33 +0800 CST

Como executar um gatilho em linhas existentes

  • 772

Tenho um processo que insere registros em uma tabela.

A tabela é definida com um gatilho como este...

CREATE TRIGGER myTrig AFTER INSERT ON myTable FOR EACH ROW EXECUTE PROCEDURE myProcedure();

O processo que faz o INSERTmyTable está fora do meu controle, basicamente apenas despeja registros na tabela ao longo do dia 24 horas por dia, 7 dias por semana.

A funcionalidade myProcedure()requer recursos de banco de dados. Durante os períodos de maior movimento, a taxa de chegada dos registros é maior do que o banco de dados pode suportar (cerca de 500 registros por segundo é o limite). Se eu desabilitar o gatilho usando ALTER TABLE myTable DISABLE TRIGGER myTrig , o sistema pode lidar com talvez 1.000 registros por segundo.

Posso então reativar o gatilho quando o sistema não estiver tão ocupado, mas obviamente os registros adicionados enquanto o gatilho estava desativado não foram processados ​​corretamente.

Existe alguma maneira de executar novamente o gatilho nos registros selecionados JÁ na tabela?

Meu melhor palpite atual é que, durante os períodos de maior movimento, devo desviar os registros recebidos para uma cópia myTableidêntica ao original (mas sem o acionador) e, quando o sistema se acalmar mais tarde, posso inserir da cópia, de volta ao original, onde eles devem ser processados ​​pelo gatilho (embora mais tarde do que deveriam)

postgresql
  • 1 1 respostas
  • 28 Views

1 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2023-02-13T09:47:19+08:002023-02-13T09:47:19+08:00

    Uma função de gatilho requer a ação de gatilho. Quando acionado FOR EACH ROW, também normalmente precisa da linha de acionamento como entrada. Mas uma função simples pode reproduzir quase tudo que uma função de gatilho faz.

    O melhor curso de ação depende se a função de gatilho myProcedure()altera a própria linha inserida .

    Nesse caso , sua ideia com uma mesa de preparação separada parece boa. Um posterior UPDATEescreveria uma nova versão de linha de qualquer maneira. Portanto, em geral, é eficiente gravar primeiro em uma tabela de preparação e INSERTdepois na tabela de destino. Se for aceitável perder dados em caso de falha do servidor, você pode até usar uma UNLOGGEDtabela para isso e lidar com ainda mais linhas por segundo.
    O eventual INSERTpara a mesa principal também disparará o gatilho, tudo feito.

    Caso contrário (e se uma UNLOGGEDtabela não for uma opção), eu escreveria diretamente na tabela de destino. Tudo o que a função de gatilho faz agora pode ser reproduzido com uma função simples. Se você não puder duplicar a funcionalidade da função de gatilho, a próxima melhor ideia seria gravar em uma cópia de myTable, com o mesmo gatilho. Apenas faça isso RETURN NULL;em vez de RETURN NEW;pular a própria linha de acionamento. (Portanto, nada é gravado na cópia.)

    Se você não puder ou não quiser fazer uma cópia modificada da função do gatilho, como alternativa, adicione outro gatilho na tabela temporária como esta:

    CREATE OR REPLACE FUNCTION public.trg_cancel_insert()
      RETURNS trigger
      LANGUAGE plpgsql AS
    $func$
    BEGIN
    RETURN NULL;
    END
    $func$;
    
    CREATE TRIGGER zzz_last_before_insert
    BEFORE INSERT ON pg_temp.myTable_copy  -- the copy!
    FOR EACH ROW EXECUTE PROCEDURE public.trg_cancel_insert();
    

    Isso também ignora a própria inserção de acionamento. Mas tudo o que é executado a myProcedure()partir do gatilho anterior ainda permanece.

    O manual:

    Se vários acionadores do mesmo tipo forem definidos para o mesmo evento, eles serão acionados em ordem alfabética por nome.

    • 2

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