Prévia do material em texto
TRIGGERS (GATILHOS) O termo trigger (gatilho em inglês) define uma estrutura do banco de dados que funciona, como o nome sugere, como uma função que é disparada mediante alguma ação. Geralmente essas ações que disparam os triggers são alterações nas tabelas por meio de operações de inserção, exclusão e atualização de dados (insert, delete e update). Um gatilho está intimamente relacionado a uma tabela, sempre que uma dessas ações é efetuada sobre essa tabela, é possível dispará-lo para executar alguma tarefa. CRIANDO TRIGGERS Sintaxe de criação de trigger: CREATE TRIGGER [NOME DO TRIGGER] ON [NOME DA TABELA] [FOR/AFTER/INSTEAD OF] [INSERT/UPDATE/DELETE] AS --CORPO DO TRIGGER Os parâmetros são: ● NOME DO TRIGGER: nome que identificará o gatilho como objeto do banco de dados. Deve seguir as regras básicas de nomenclatura de objetos. ● NOME DA TABELA: tabela à qual o gatilho estará ligado, para ser disparado mediante ações de insert, update ou delete. ● FOR/AFTER/INSTEAD OF: uma dessas opções deve ser escolhida para definir o momento em que o trigger será disparado. FOR é o valor padrão e faz com o que o gatilho seja disparado junto da ação. AFTER faz com que o disparo se dê somente após a ação que o gerou ser concluída. INSTEAD OF faz com que o trigger seja executado no lugar da ação que o gerou. ● INSERT/UPDATE/DELETE: uma ou várias dessas opções (separadas por vírgula) devem ser indicadas para informar ao banco qual é a ação que disparará o gatilho. Por exemplo, se o trigger deve ser disparado após toda inserção, deve-se utilizar AFTER INSERT. Exemplo CREATE TRIGGER atualiza_funcionario AFTER INSERT OR UPDATE ON funcionario FOR EACH ROW EXECUTE PROCEDURE update(); STORED PROCEDURE (PROCEDIMENTOS) Stored procedures são, pequenos pedaços de código que ficam armazenados no lado do servidor de banco de dados. A construção desses pedaços de código é tida como uma boa prática por programadores que podem, por exemplo, deixar no lado do servidor códigos complexos que são utilizados por vários aplicativos, evitando a necessidade de replicá-los em cada um deles. Diferentemente de outros SGBDs que tratam os conceitos de procedimentos armazenados, gatilhos e funções como coisas distintas, o PostgreSQL trata todos eles como funções No PostgreSQL podemos utilizar diferentes linguagens para escrevermos nossas funções. Essas linguagens podem ser divididas em três grupos ou categorias: as não procedurais, as procedurais e as que utilizam linguagem externa e mais complexa. As não procedurais utilizam a SQL como linguagem. Exemplo CREATE OR REPLACE FUNCTION update() RETURNS TRIGGER AS $$ BEGIN INSERT INTO historico VALUES(old.cod_func, old.cod_depto, old.nome, old.salario, old.cargo, old.data); RETURN NULL; END; $$ LANGUAGE PLPGSQL; FUNCTION (FUNÇÃO) Uma function é um bloco PL/SQL muito semelhante a uma procedure. O que podemos entender de início entre esses dois tipos de blocos é que os blocos functions retornam valores e as procedures podem ou não retornar um valor. As functions têm duas características que diferem das procedures, as quais não podem deixar de tratar: ● As functions sempre retornam valores ● Functions são usadas como parte de uma expressão. Os parâmetros são: ● CREATE [OR REPLACE] FUNCTION: Caso uma function já exista com o mesmo nome, ela será reescrita devido ao termo ‘replace’. Caso contrário, ela será criada de acordo com o termo ‘create’. ● Function_name: Será o nome atribuído para essa função. ● Parameters: a lista opcional de parâmetros contém os nomes, os modos e os tipos que esses parâmetros terão. O IN representa o valor que será passado de fora, já o OUT representa que este parâmetro será utilizado para retornar um valor de fora do procedimento. ● Return_datatype: é o tipo de retorno que será utilizado, sendo este SQL ou PL/SQL. Podemos neste caso utilizar referências como o %TYPE ou %ROWTYPE se necessário, ou mesmo utilizar qualquer tipo de dados escalar ou composto. ● IS/AS: por convecção, temos o ‘is’ para a criação de funções armazenadas e o ‘as’ quando criamos pacotes (packages). ● function_body: contém o bloco PL/SQL que inicia com a claúsula BEGIN e finaliza com END [function_name], e executa neste momento todas as instruções necessárias. Exemplo CREATE OR REPLACE FUNCTION CALCULO() RETURNS FLOAT AS $$ DECLARE i FLOAT := 0; soma RECORD; media FLOAT := 0; BEGIN FOR soma IN SELECT * FROM funcionario LOOP i := i + soma.salario; END LOOP; media := i / 5; RETURN i; RAISE NOTICE '%',i; END $$ LANGUAGE PLPGSQL;