Objetivos da Aula
// O que você será capaz de fazer
Controle de Acesso
- Criar e gerenciar usuários e roles
- Conceder e revogar permissões específicas
Controle de Transações
- Garantir propriedades ACID
- Implementar transações seguras
Concorrência
- Resolver problemas de acesso simultâneo
- Implementar níveis de isolamento
Roteiro da Aula
SQL DCL & TCL
// Controle de Acesso e Transações
O SQL DCL (Data Control Language) gerencia permissões de acesso aos dados, enquanto o SQL TCL (Transaction Control Language) gerencia o fluxo de transações no banco de dados.
DCL – Controle de Acesso
GRANT
: Conceder permissões (SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES).REVOKE
: Revogar permissões concedidas.- Criação de usuários e roles (papéis).
TCL – Controle de Transações
BEGIN
/START TRANSACTION
: Inicia uma transação.COMMIT
: Confirma alterações.ROLLBACK
: Desfaz alterações.SAVEPOINT
: Marca um ponto para possível retorno parcial.
GRANT
Propriedades ACID
// Garantindo Integridade das Transações
Uma transação confiável segue as propriedades ACID:
Propriedade | Descrição |
---|---|
Atomicidade | Ou todas as operações são concluídas, ou nenhuma é aplicada. |
Consistência | O banco permanece em um estado válido antes e depois da transação. |
Isolamento | Transações não interferem nos dados umas das outras. |
Durabilidade | Alterações confirmadas persistem mesmo após falhas. |
Atomicidade
Caso Real: Sistema Bancário
Como as propriedades ACID previnem problemas em transferências entre contas:
- Atomicidade: Garante que débito e crédito aconteçam juntos
- Consistência: Mantém o saldo total do banco correto
- Isolamento: Impede que outra transação veja valores intermediários
- Durabilidade: Assegura que a transferência não será perdida
Durabilidade
Comandos DCL
// Controle de Acesso
GRANT
concede permissões, REVOKE
revoga, e usuários/roles gerenciam acesso.
CREATE USER admin_projetos
WITH PASSWORD 'admin123';
CREATE USER analista
WITH PASSWORD '1234';
CREATE ROLE leitor;
GRANT SELECT ON projetos
TO analista;
GRANT ALL PRIVILEGES ON projetos
TO admin_projetos;
GRANT leitor TO analista;
REVOKE SELECT ON projetos
FROM analista;
CREATE USER 'admin_projetos'@'localhost'
IDENTIFIED BY 'admin123';
CREATE USER 'analista'@'localhost'
IDENTIFIED BY '1234';
GRANT SELECT ON gestao_projetos.projetos
TO 'analista'@'localhost';
GRANT ALL PRIVILEGES ON gestao_projetos.projetos
TO 'admin_projetos'@'localhost';
REVOKE SELECT ON gestao_projetos.projetos
FROM 'analista'@'localhost';
UPDATE
em projetos
a admin_projetos
.
GRANT UPDATE ON projetos TO admin_projetos;
Comandos TCL
// Controle de Transações
BEGIN
/START TRANSACTION
inicia, COMMIT
confirma, ROLLBACK
desfaz.
BEGIN;
UPDATE contas
SET saldo = saldo - 100
WHERE id = 1;
UPDATE contas
SET saldo = saldo + 100
WHERE id = 2;
COMMIT;
-- Para desfazer
BEGIN;
UPDATE contas
SET saldo = saldo - 100
WHERE id = 1;
UPDATE contas
SET saldo = saldo + 100
WHERE id = 2;
ROLLBACK;
START TRANSACTION;
UPDATE contas
SET saldo = saldo - 100
WHERE id = 1;
UPDATE contas
SET saldo = saldo + 100
WHERE id = 2;
COMMIT;
-- Para desfazer
START TRANSACTION;
UPDATE contas
SET saldo = saldo - 100
WHERE id = 1;
UPDATE contas
SET saldo = saldo + 100
WHERE id = 2;
ROLLBACK;
ROLLBACK;
SAVEPOINT e Concorrência
// Pontos de Controle
SAVEPOINT
cria pontos de retorno. Controle de concorrência evita leitura suja, não repetível, e fantasmas.
BEGIN;
UPDATE contas
SET saldo = saldo - 50
WHERE id = 1;
SAVEPOINT ponto1;
UPDATE contas
SET saldo = saldo - 50
WHERE id = 1;
ROLLBACK TO ponto1;
COMMIT;
Leitura suja
Atividade Prática
// Controle de Acesso e Transações
- Criar banco
banco
e tabelacontas
. - Criar usuários
admin_projetos
eanalista
. ConcederALL PRIVILEGES
ao admin eSELECT
ao analista. - Testar permissões (tentar
INSERT
comanalista
). - Executar transação bancária com
COMMIT
/ROLLBACK
.
Visualização: Transferência Bancária
CREATE DATABASE banco;
\c banco
CREATE TABLE contas (
id SERIAL PRIMARY KEY,
titular TEXT,
saldo NUMERIC
);
INSERT INTO contas (titular, saldo)
VALUES ('Ana', 500), ('Bruno', 300);
CREATE USER admin_projetos
WITH PASSWORD 'admin123';
CREATE USER analista
WITH PASSWORD '1234';
GRANT ALL PRIVILEGES ON contas
TO admin_projetos;
GRANT SELECT ON contas
TO analista;
-- Teste com analista
INSERT INTO contas (titular, saldo)
VALUES ('Clara', 200);
-- Erro: Permissão negada
BEGIN;
UPDATE contas
SET saldo = saldo - 100
WHERE id = 1;
UPDATE contas
SET saldo = saldo + 100
WHERE id = 2;
-- Verifica saldo
SELECT saldo FROM contas
WHERE id = 1;
-- Se saldo < 0, ROLLBACK
ROLLBACK;
CREATE DATABASE banco;
USE banco;
CREATE TABLE contas (
id INT AUTO_INCREMENT PRIMARY KEY,
titular VARCHAR(100),
saldo DECIMAL(10,2)
);
INSERT INTO contas (titular, saldo)
VALUES ('Ana', 500), ('Bruno', 300);
CREATE USER 'admin_projetos'@'localhost'
IDENTIFIED BY 'admin123';
CREATE USER 'analista'@'localhost'
IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON banco.contas
TO 'admin_projetos'@'localhost';
GRANT SELECT ON banco.contas
TO 'analista'@'localhost';
-- Teste com analista
INSERT INTO contas (titular, saldo)
VALUES ('Clara', 200);
-- Erro: Permissão negada
START TRANSACTION;
UPDATE contas
SET saldo = saldo - 100
WHERE id = 1;
UPDATE contas
SET saldo = saldo + 100
WHERE id = 2;
-- Verifica saldo
SELECT saldo FROM contas
WHERE id = 1;
-- Se saldo < 0, ROLLBACK
ROLLBACK;
-- PostgreSQL: Confirmar transação BEGIN; UPDATE contas SET saldo = saldo - 100 WHERE id = 1; UPDATE contas SET saldo = saldo + 100 WHERE id = 2; COMMIT; -- MySQL: Confirmar transação START TRANSACTION; UPDATE contas SET saldo = saldo - 100 WHERE id = 1; UPDATE contas SET saldo = saldo + 100 WHERE id = 2; COMMIT;
Quiz Interativo
// Teste seus Conhecimentos
Teste de Conhecimento
Responda às perguntas sobre DCL e TCL.
1. Qual comando concede permissões?
2. Qual comando inicia uma transação no MySQL?
3. O que garante atomicidade?
4. Qual comando revoga permissões?
5. O que é um SAVEPOINT?
6. Qual problema é evitado por concorrência?
RUN dcl_tcl_quiz;
-- Quiz finalizado. Parabéns!
Referências
// Fontes Utilizadas
- Date, C. J. Introdução a Sistemas de Banco de Dados
- Documentação oficial do PostgreSQL e MySQL
- Exemplos adaptados do modelo relacional S-P-SP