Pular para o conteúdo

Procedures, triggers e views; PostgreSQL e Oracle

Prioridade Média 16 min de leitura Status: Não visto Lido Praticado Dominado

Do zero

Até aqui, o banco de dados foi um armário onde se guarda e se consulta. Ele também pode trabalhar sozinho:

  • Uma view é uma janela com moldura: em vez de mostrar a tabela inteira, mostra só uma parte, já filtrada e juntada, como se fosse uma tabela. Você consulta a view como consulta uma tabela, mas ela não guarda dados próprios; é uma consulta salva com nome.
  • Uma stored procedure é uma receita guardada no banco: um conjunto de comandos que se executa com uma chamada (“reajustar todos os contratos em 5%”).
  • Uma function é parecida, mas devolve um valor e pode ser usada dentro de um SELECT, como calcula_multa(valor).
  • Um trigger (gatilho) é um alarme: dispara sozinho quando algo acontece numa tabela, por exemplo, “sempre que o valor de um contrato mudar, grave um registro de auditoria”.

PostgreSQL e Oracle são dois dos SGBDs (sistemas gerenciadores de banco de dados) relacionais mais usados no setor público. Os dois falam SQL, mas cada um tem a sua linguagem procedural (PL/pgSQL e PL/SQL) e as suas ferramentas de administração.

Frase para guardar: view é consulta com nome; procedure executa, function devolve valor; trigger dispara sozinho com um evento.

Em 1 minuto

  • View: tabela virtual definida por um SELECT; simplifica consultas e restringe o que o usuário vê. A view materializada guarda o resultado e precisa ser atualizada (REFRESH).
  • Stored procedure: no PostgreSQL, chamada com CALL; no Oracle, com CALL, com EXEC no SQL*Plus ou pelo nome dentro de um bloco PL/SQL (EXEC também é o comando do SQL Server). Pode receber parâmetros de entrada e saída.
  • Function: devolve um valor e pode aparecer em SELECT e WHERE.
  • Trigger: associado a uma tabela e a um evento (INSERT, UPDATE, DELETE), antes (BEFORE) ou depois (AFTER), por linha (FOR EACH ROW) ou por comando. Acessa os valores antigos e novos (OLD e NEW).
  • Administração: usuários e papéis com GRANT e REVOKE, backup, estatísticas para o otimizador, monitoramento e ajuste de consultas.

Exemplo concreto: auditoria dos contratos no PostgreSQL

View com os contratos vigentes, para o painel da diretoria:

CREATE VIEW contrato_vigente AS
SELECT c.numero, c.objeto, c.valor, f.nome AS fornecedor
FROM contrato c
JOIN fornecedor f ON f.cnpj = c.cnpj
WHERE c.fim >= CURRENT_DATE;

-- Usada como uma tabela
SELECT * FROM contrato_vigente WHERE valor > 100000;

Trigger que registra toda mudança de valor:

CREATE FUNCTION registra_alteracao() RETURNS trigger AS $$
BEGIN
  INSERT INTO auditoria_contrato (numero, valor_antigo, valor_novo, usuario, alterado_em)
  VALUES (OLD.numero, OLD.valor, NEW.valor, current_user, now());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_auditoria_valor
AFTER UPDATE OF valor ON contrato
FOR EACH ROW
WHEN (OLD.valor IS DISTINCT FROM NEW.valor)   -- só quando o valor muda de fato
EXECUTE FUNCTION registra_alteracao();

No PostgreSQL, o trigger chama uma função à parte. No Oracle, o mesmo gatilho tem o corpo no próprio trigger, e os registros levam dois-pontos (:OLD e :NEW):

CREATE OR REPLACE TRIGGER trg_auditoria_valor
AFTER UPDATE OF valor ON contrato
FOR EACH ROW
BEGIN
  INSERT INTO auditoria_contrato (numero, valor_antigo, valor_novo, usuario, alterado_em)
  VALUES (:OLD.numero, :OLD.valor, :NEW.valor, USER, SYSTIMESTAMP);
END;
/

Procedure para o reajuste anual:

CREATE PROCEDURE reajustar(p_percentual numeric)
LANGUAGE plpgsql AS $$
BEGIN
  UPDATE contrato SET valor = valor * (1 + p_percentual / 100);
END;
$$;

CALL reajustar(5);   -- e o trigger registra cada contrato alterado

Comparação: os objetos e os dois SGBDs

Objeto Guarda dados? Como se usa Uso típico
View Não (só a consulta) SELECT … FROM view Simplificar e restringir o acesso
View materializada Sim (o resultado) SELECT; REFRESH para atualizar Relatórios pesados
Function Não Dentro de SELECT ou WHERE Cálculos reutilizáveis
Procedure Não CALL ou EXEC Rotinas de processamento
Trigger Não Dispara sozinho num evento Auditoria, regras de integridade
PostgreSQL Oracle Database
Licença Código aberto Comercial
Linguagem procedural PL/pgSQL PL/SQL (com packages)
Concorrência MVCC: versões das linhas; VACUUM remove as versões mortas MVCC com segmentos de undo
Estatísticas do otimizador ANALYZE (e o autovacuum) Coleta de estatísticas (DBMS_STATS)
Plano de execução EXPLAIN e EXPLAIN ANALYZE EXPLAIN PLAN
Backup pg_dump e pg_restore (lógico); backup físico com arquivamento do WAL RMAN; Data Pump (lógico)
Armazenamento Bancos, schemas e tablespaces Tablespaces formadas por datafiles
Registro de transações WAL (write-ahead log) Redo log

MVCC (controle de concorrência multiversão) é o que permite que leituras não bloqueiem escritas: cada transação enxerga uma versão consistente dos dados. No PostgreSQL, as versões antigas viram “tuplas mortas”, que o VACUUM limpa.

Como a FCC cobra

Diferença entre view, procedure, function e trigger, e as características de um trigger (evento, BEFORE ou AFTER, por linha, OLD e NEW).

  • View comum × materializada.
  • Procedure × function.
  • Uso de triggers para auditoria e as variáveis OLD e NEW.
  • Comandos de administração do PostgreSQL (VACUUM, ANALYZE, EXPLAIN, pg_dump) e conceitos do Oracle (tablespace, PL/SQL, RMAN).

Pegadinhas

  • “Uma view comum armazena uma cópia dos dados.” Falso: guarda só a consulta; quem guarda o resultado é a view materializada.
  • “Trigger precisa ser chamado explicitamente pela aplicação.” Falso: dispara sozinho com o evento.
  • “Function e procedure são idênticas.” Falso: a function devolve valor e pode ser usada em SELECT.
  • “O VACUUM do PostgreSQL apaga linhas válidas da tabela.” Falso: remove versões mortas, deixadas pelo MVCC.
  • “No trigger de DELETE, o NEW traz os valores da linha apagada.” Falso: no DELETE os valores ficam só no OLD (o NEW é nulo); no INSERT, só o NEW tem valores.

Explique com suas palavras

Explique a um gestor como um trigger pode garantir a auditoria das mudanças nos contratos, e qual a diferença entre ele e uma procedure.

  1. Escreva sem olhar a lição, com frases curtas e um exemplo seu.
  2. Onde travar ou precisar de jargão, há uma lacuna: releia só essa parte.
  3. Compare com a explicação-modelo e reescreva o que faltou.

Fica salva neste navegador.

Comparar com uma explicação-modelo

Um trigger é um gatilho preso à tabela de contratos: toda vez que alguém muda o valor de um contrato, o próprio banco grava, sozinho, uma linha de auditoria com o valor antigo, o novo, quem mudou e quando. Como quem dispara é o banco, não depende de a aplicação lembrar de registrar: vale para qualquer sistema ou pessoa que alterar a tabela.

A procedure é diferente: é uma rotina guardada no banco que só roda quando alguém a chama, como o reajuste anual de todos os contratos. A procedure executa quando pedida; o trigger reage a um evento.

Teste-se

Banco de Dados · Procedures e SGBDs · Inédita, estilo FCC

Questão 1 de 3

Para que os analistas consultem apenas os contratos vigentes, já com o nome do fornecedor, sem acesso às tabelas originais, o administrador criou um objeto definido por uma consulta SELECT, que é usado como se fosse uma tabela, mas não armazena dados próprios. Esse objeto é uma

Alternativas

A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.

Toque longo numa alternativa para riscá-la.

Banco de Dados · Procedures e SGBDs · Inédita, estilo FCC

Questão 2 de 3

Deseja-se que, sempre que o valor de um contrato for alterado, por qualquer sistema ou usuário, o próprio banco grave numa tabela de auditoria o valor anterior e o novo. O recurso adequado é um trigger

Alternativas

A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.

Toque longo numa alternativa para riscá-la.

Banco de Dados · Procedures e SGBDs · Inédita, estilo FCC

Questão 3 de 3

Em SGBDs como o PostgreSQL, a diferença usual entre uma function e uma stored procedure é que a function

Alternativas

A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.

Toque longo numa alternativa para riscá-la.

Mais duas questões deste tópico estão em Questões.

Flashcards gerados

FrenteVerso
Trigger Rotina associada a uma tabela que dispara sozinha num evento (INSERT, UPDATE, DELETE), antes ou depois dele. Exemplo: Gravar auditoria sempre que o valor de um contrato mudar.
Para que usar views na segurança? Para dar a cada perfil acesso só às colunas e linhas de que precisa, com GRANT na view e não na tabela.
Linguagens procedurais do PostgreSQL e do Oracle PL/pgSQL no PostgreSQL; PL/SQL no Oracle, que também organiza rotinas em packages.
MVCC Controle de concorrência multiversão. Cada transação vê uma versão consistente, e leituras não bloqueiam escritas.
Backup no PostgreSQL e no Oracle PostgreSQL, pg_dump e pg_restore (lógico) e backup físico com WAL; Oracle, RMAN e Data Pump.

Ligação com o estudo de caso

Auditoria é o coração de um tribunal de contas. Num caso sobre rastrear alterações em dados sensíveis, proponha um trigger de auditoria (com usuário, data, valor antigo e novo) numa tabela protegida contra alteração, views para dar a cada perfil só o que ele precisa ver, e GRANT restrito às views em vez das tabelas.

Fontes da lição

Claude explica

Tire dúvidas sobre este tema no Claude: o site copia o pedido com a lição e abre uma conversa nova, na sua conta. Confira na fonte qualquer fato de lei ou de norma.

Pratique fora do site

Faça questões da FCC sobre este tópico no QConcursos ou no Gran e registre aqui quantas fez: elas contam na meta da semana e no status do tópico.

Registrar questões feitas lá
Errei uma questão lá: criar flashcard