9.29. Funções de gatilho #

Enquanto muitos usos de gatilho envolvem funções de gatilho escritas pelo usuário, o PostgreSQL fornece algumas funções de gatilho nativas que podem ser usadas diretamente em gatilhos definidos pelo usuário. Estas funções estão resumidas na Tabela 9.110. (Existem funções de gatilho nativas adicionais, que implementam restrições de chave estrangeira e restrições de índice adiadas. Estas funções não estão documentados aqui, porque os usuários não precisam usá-las diretamente.)

Para obter mais informações sobre como criar gatilhos, veja CREATE TRIGGER.

Tabela 9.110. Funções de gatilho nativas

Função

Descrição

Exemplo de uso

suppress_redundant_updates_trigger ( ) → trigger

Suprime operações de atualização não-faça-nada. Veja abaixo para obter detalhes.

CREATE TRIGGER ... suppress_redundant_updates_trigger()

tsvector_update_trigger ( ) → trigger

Atualiza automaticamente uma coluna do tipo de dados tsvector a partir da(s) coluna(s) de texto puro do documento associada(s). A configuração de procura de texto a ser usada é especificada pelo nome como argumento do gatilho. Veja a Seção 12.4.3 para obter detalhes.

CREATE TRIGGER ... tsvector_update_trigger(tsvcol, 'pg_catalog.swedish', title, body)

tsvector_update_trigger_column ( ) → trigger

Atualiza automaticamente uma coluna do tipo de dados tsvector a partir da(s) coluna(s) de texto puro do documento associada(s). A configuração de procura de texto a ser usada é obtida a partir de uma coluna do tipo de dados regconfig da tabela. Veja a Seção 12.4.3 para obter detalhes.

CREATE TRIGGER ... tsvector_update_trigger_column(tsvcol, tsconfigcol, title, body)


A função suppress_redundant_updates_trigger, quando aplicada como um gatilho no nível de linha BEFORE UPDATE, impedirá que ocorra qualquer atualização que não altere realmente os dados na linha. Isto substitui o comportamento normal que sempre executa a atualização da linha física, independentemente dos dados terem sido alterados ou não. (Este comportamento normal faz com que as atualizações sejam executadas mais rapidamente, já que nenhuma verificação é necessária, e também é útil em certos casos.)

Idealmente, deve ser evitada a execução de atualizações que não alteram os dados no registro. Atualizações redundantes podem custar um tempo desnecessário considerável, especialmente se houver muitos índices a serem alterados, e espaço em linhas mortas que eventualmente precisarão ser limpas. Entretanto, detectar tais situações pelo código do cliente nem sempre é fácil, ou mesmo possível, e escrever expressões para detectá-las pode ser propenso a erros. Uma alternativa é usar a função suppress_redundant_updates_trigger, que vai ignorar as atualizações que não alteram dados. Entretanto, esta função deve ser usada com cuidado. O gatilho leva um tempo pequeno, mas não trivial, para cada registro, portanto, se a maioria dos registros afetados pelas atualizações realmente mudar, o uso deste gatilho fará com que as atualizações sejam executadas mais lentamente, em média.

A função suppress_redundant_updates_trigger pode ser adicionado a uma tabela desta forma:

CREATE TRIGGER z_min_update
BEFORE UPDATE ON tablename
FOR EACH ROW EXECUTE FUNCTION suppress_redundant_updates_trigger();

Geralmente é necessário disparar este gatilho por último para cada linha, para que este gatilho não substitua outros gatilhos que possam querer alterar a linha. Tendo em mente que os gatilhos são acionados na ordem alfabética do nome, deve ser escolhido um nome de gatilho que venha após o nome de qualquer outro gatilho que a tabela possa ter. (Daí o prefixo z no exemplo.)