Eu tenho ticket de mesa que tem essas (e outras) colunas:
- Eu iria
- Tipo de bilhete
- cliente
Se ticket_type
ou client
for atualizado, a tabela transfere_table
deverá ser arquivada. O ticket.id do ticket alterado deve ser inserido na tabela de transferência.
Aqui está o código de trabalho:
CREATE FUNCTION add_ticket_to_transfere_table () RETURNS trigger
LANGUAGE plpythonu AS $$
plpy.execute(plpy.prepare(
'''INSERT INTO transfere_table (ticket_id) VALUES ($1)''',
['int']), [TD['new']['id']])
$$;
CREATE TRIGGER add_ticket_to_transfere_table_trigger
AFTER UPDATE OF ticket_type_id, client_id ON ticket
FOR EACH ROW
WHEN (OLD.ticket_type_id != NEW.ticket_type_id or
OLD.client_id != NEW.client_id)
EXECUTE PROCEDURE add_ticket_to_transfere_table();
Como eu só usei plpythonu até agora, resolvi assim. Funciona, mas vejo duas coisas para melhorar:
- se livrar de FOR EACH ROW: Se N linhas forem atualizadas, seria bom se apenas um INSERT fosse executado
- Não use plpythonu
Como realizar essas melhorias?
Existem outras coisas que poderiam ser melhoradas?
Estou usando o PostgreSQL 9.3.13
Como isso funcionaria, você não teria acesso a OLD ou NEW, porque seria um gatilho de instrução.
O Python nativamente não oferece suporte à execução como uma linguagem confiável. Você pode usar facilmente
plpgsql
.Código para uma função plpgsql,
Não é assim que eu pessoalmente executaria isso. O que eu faria é
triaged
ou o que quer quetransfere_table
represente.Se você não quiser tocar na própria tabela, eu executaria seu processo no sentido inverso.
Crie a tabela
transfere_done
Copie todos os ids para ele.
Crie a visualização abaixo,
Agora, quando você insere em
ticket
, ele aparece automaticamente emtransfere_queue
até você inserir emtransfere_done
. Você pode ou não quererMATERIALIZE
a vista. De qualquer forma, eu realmente odeio gatilhos quando não são necessários e tento criar em torno deles.