Conteúdos da cadeira

Vistas, gatilhos e controlo de acessos

CREATE VIEW, CREATE TRIGGER e GRANT e REVOKE com testes.

Markdown

Perguntar sobre esta página

ChatGPTClaudePerplexityGeminiCopiar e abrir

Envia o link e pede à IA para ler a página. No Gemini, cola a pergunta copiada.

Ver pergunta para copiar
Nesta página

Tabelas guardam factos; o resto da gestão faz-se com objetos que vivem por cima delas. Uma vista (view) é uma pergunta guardada com nome, um gatilho (trigger) é código que dispara sozinho em cada escrita, e o controlo de acessos decide que utilizadores podem fazer o quê.

Vistas: perguntas com nome

“Total gasto por cada cliente” da página de consultas merece nome próprio se for pedida todos os dias:

CREATE VIEW TotalPorCliente AS
SELECT Cliente.nome AS nome, COALESCE(SUM(Item.qtd * Produto.preco), 0) AS total
FROM Cliente
LEFT JOIN Encomenda ON Encomenda.idCliente = Cliente.id
LEFT JOIN Item ON Item.idEncomenda = Encomenda.id
LEFT JOIN Produto ON Produto.id = Item.idProduto
GROUP BY Cliente.nome;

Depois usa-se como tabela: SELECT * FROM TotalPorCliente WHERE total > 100; devolve só a Ana com 295. A vista não duplica dados, recalcula em cada uso, por isso reflete sempre as vendas atuais. Serve para simplificar (SELECT curto em vez da junção de quatro tabelas) e para segurança (mostrar totais sem expor linhas individuais).

Gatilhos: regras que se cumprem sozinhas

O CHECK (stock >= 0) impede stock negativo em escritas diretas, mas uma venda deve decrementar o stock e falhar se não houver. Um gatilho corre antes de cada atualização e aborta a operação proibida:

CREATE TRIGGER impede_stock_negativo
BEFORE UPDATE OF stock ON Produto
FOR EACH ROW
WHEN NEW.stock < 0
BEGIN
  SELECT RAISE(ABORT, 'Stock nao pode ser negativo');
END;

Teste: UPDATE Produto SET stock = stock - 1 WHERE id = 12; passa (5 para 4). Mas UPDATE Produto SET stock = stock - 10 WHERE id = 12; aborta com a mensagem do gatilho e o stock continua 4, porque a transação da instrução é desfeita. Repara na diferença para o CHECK: o gatilho reage ao evento (a tentativa de atualização) e pode olhar para os valores antigos (OLD) e novos (NEW).

Controlo de acessos

Em SQL padrão, o dono dá e tira permissões por utilizador e por objeto:

GRANT SELECT ON TotalPorCliente TO funcionario;
REVOKE INSERT ON Produto FROM funcionario;

O funcionário consulta os totais mas não altera produtos. Atenção a um detalhe prático: o SQLite, o software da cadeira, não tem utilizadores nem implementa GRANT e REVOKE; aqui o controlo de acessos estuda-se como linguagem padrão, a usar num SGBD com contas, como o PostgreSQL. No teste, responde o SQL padrão; no projeto em SQLite, a proteção equivalente faz-se com vistas e gatilhos.

Ver o ficheiro no GitHub

À tua maneira

Escolhe como preferes ler.

Aparência
Ajustar cores e largura
Cor de destaque do tema FEUP
Tipo de letra

Álgebra, lógica e uma ideia de cada vez.

As tuas escolhas ficam guardadas neste navegador.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.