Qual é a diferença entre uma atualização posterior e uma atualização anterior no PostgreSQL? Não consegui entender a diferença entre after update
e before update
porque parece que a função sempre foi executada antes da atualização.
Então fiz o seguinte exemplo:
Fiz uma função que atualiza uma tabela quando o status é typing
mas com um atraso de 10 segundos.
CREATE OR REPLACE FUNCTION fai_prueba()
RETURNS trigger AS
$BODY$
begin
if new.status = 'Typing' then
update image set status = 'ToTyping', path = 'Real path' from pg_sleep(5) where id = old.id;
end if;
return null;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION fai_prueba()
OWNER TO postgres;
então eu tenho o seguinte gatilho
create trigger tai
after update on image
for each row execute procedure fai_prueba();
mas quando executo um UPDATE a consulta não acaba até acabar o atraso
UPDATE image
SET path='fake path'
, status= 'Typing'
WHERE id=5;
>Query returned successfully: 0 rows affected, 10042 ms execution time.
Então, é possível que a consulta de atualização termine antes do gatilho?
Há uma diferença primária em um gatilho que está DEPOIS de um que está ANTES .. mas ambos são executados independentemente.
Em um gatilho BEFORE, o gatilho é executado ANTES da instrução DML ser
DELETE
executadaBEFORE
. o que você pode fazer (como verificar dados em uma tabela separada e emitir uma atualização/inserção/qualquer coisa nessa tabela, etc). Se, por algum motivo, o gatilho causar uma EXCEÇÃO, a execução será interrompida e a instrução DML nunca será executada.Em um gatilho AFTER, o gatilho é executado DEPOIS que a instrução DML é executada. Você já perdeu a capacidade de modificar os registros :NEW e :OLD e fazer com que eles realmente signifiquem alguma coisa. No entanto, você ainda pode fazer o que quiser no gatilho. Se o gatilho causar uma exceção, para PostgreSQL, isso causará uma reversão do DML original. Não acredito que isso seja verdade para todos os RDBMSs - mas estou tendo dificuldade em encontrar um exemplo agora.
Um uso comum de um gatilho BEFORE é definir uma coluna de registro de data e hora como "agora" antes que os dados sejam inseridos.
Um uso comum de um gatilho AFTER é preencher uma tabela de auditoria/histórico com as alterações.
Em ambos os casos, você normalmente deseja emitir um ROLLBACK se descobrir que uma exceção foi levantada.