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

1. Fundamentos de Transações
2. Comandos TCL
3. Controle de Acesso
4. Casos Práticos Integrados

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.
Atividade Prática: Cite um comando DCL.

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

Início
Operação 1
Operação 2
COMMIT
OU
ROLLBACK

Caso Real: Sistema Bancário

Como as propriedades ACID previnem problemas em transferências entre contas:

  1. Atomicidade: Garante que débito e crédito aconteçam juntos
  2. Consistência: Mantém o saldo total do banco correto
  3. Isolamento: Impede que outra transação veja valores intermediários
  4. Durabilidade: Assegura que a transferência não será perdida
Atividade Prática: Qual propriedade garante alterações permanentes?

Comandos DCL

// Controle de Acesso

GRANT concede permissões, REVOKE revoga, e usuários/roles gerenciam acesso.

db_admin@postgres:~#

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;
          
db_admin@mysql:~#

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';
          
Atividade Prática: Conceda UPDATE em projetos a admin_projetos.

Comandos TCL

// Controle de Transações

BEGIN/START TRANSACTION inicia, COMMIT confirma, ROLLBACK desfaz.

db_admin@postgres:~#

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;
          
db_admin@mysql:~#

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;
          
Atividade Prática: Escreva um comando para desfazer uma transação.

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.

db_admin@postgres:~#

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;
          
Atividade Prática: Nomeie um problema de concorrência.

Atividade Prática

// Controle de Acesso e Transações

Objetivo: Criar usuários, testar permissões e simular uma transação bancária.
  1. Criar banco banco e tabela contas.
  2. Criar usuários admin_projetos e analista. Conceder ALL PRIVILEGES ao admin e SELECT ao analista.
  3. Testar permissões (tentar INSERT com analista).
  4. Executar transação bancária com COMMIT/ROLLBACK.

Visualização: Transferência Bancária

Contas (Origem) id, saldo Contas (Destino) id, saldo Transferência
db_admin@postgres:~#

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;
          
db_admin@mysql:~#

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;
          

Quiz Interativo

// Teste seus Conhecimentos

Teste de Conhecimento

Responda às perguntas sobre DCL e TCL.

1. Qual comando concede permissões?

a) GRANT
b) REVOKE
c) COMMIT
d) ROLLBACK
Resposta Correta: a) GRANT. Concede permissões.

2. Qual comando inicia uma transação no MySQL?

a) BEGIN
b) START TRANSACTION
c) OPEN
d) COMMIT
Resposta Correta: b) START TRANSACTION. Inicia uma transação no MySQL.

3. O que garante atomicidade?

a) Tudo ou nada
b) Alterações permanentes
c) Isolamento
d) Validações
Resposta Correta: a) Tudo ou nada. Garante execução completa.

4. Qual comando revoga permissões?

a) GRANT
b) REVOKE
c) BEGIN
d) SAVEPOINT
Resposta Correta: b) REVOKE. Remove permissões concedidas.

5. O que é um SAVEPOINT?

a) Tabela virtual
b) Ponto de retorno
c) Permissão de usuário
d) Índice
Resposta Correta: b) Ponto de retorno. Permite rollback parcial.

6. Qual problema é evitado por concorrência?

a) Leitura suja
b) Chave primária
c) Integridade
d) Tipo de dado
Resposta Correta: a) Leitura suja. Evita dados não confirmados.
db_quiz_results:~#

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