Aula 21: Gerenciamento de usuários — CREATE USER, GRANT e REVOKE

Aula 21: Gerenciamento de usuários — CREATE USER, GRANT e REVOKE

O Gerenciamento de usuários é uma das disciplinas mais críticas e sensíveis dentro de um banco de dados Oracle. Quando falamos de ambientes corporativos, cada conexão, cada privilégio concedido e cada revogação de acesso impacta diretamente a segurança da informação, a conformidade com políticas internas e a estabilidade operacional dos sistemas. Nesta aula avançada do curso Oracle SQL — Do Zero ao Avançado, você vai dominar os três comandos fundamentais para administrar identidades e permissões no Oracle Database: CREATE USER, GRANT e REVOKE.

Em nossos projetos na JRT Technology Solutions, lidamos diariamente com auditorias de acesso, segregação de funções e implantações de ambientes críticos. O domínio correto desses comandos evita falhas graves, como concessão excessiva de privilégios, exposição de dados sensíveis e indisponibilidade de sistemas por configurações incorretas de schemas e tablespaces. Esta aula foi desenhada para que você saia da teoria e consiga executar, do zero, um fluxo completo de criação, concessão, verificação e revogação de acessos.

Você aprenderá não apenas a sintaxe dos comandos, mas também o contexto de segurança por trás de cada cláusula. Vamos explorar a diferença entre usuário e schema, a função das tablespaces default e temporária, o papel das quotas, o uso de profiles para políticas de senha e a organização de privilégios por meio de roles. Tudo isso com exemplos práticos, execução em SQL*Plus e ferramentas de verificação baseadas em dicionários de dados.

Esta aula pressupõe que você já concluiu as aulas anteriores, especialmente aquelas que tratam de conexão com o banco Oracle, estrutura de schemas, consultas a tabelas do dicionário de dados e execução de comandos DDL básicos. Se você ainda não tem um ambiente Oracle disponível, prepare-se para seguir os passos de verificação que indicaremos no início. Ao final, você será capaz de criar usuários com políticas adequadas, conceder apenas os acessos necessários, revogar permissões com precisão e auditar concessões por meio de consultas a tabelas administrativas.

O que você vai aprender nesta aula

Esta aula é intensiva e prática. Ao concluir a leitura e a execução dos exemplos, você terá domínio sobre os seguintes pontos:

  • Diferença conceitual entre usuário e schema no Oracle Database;
  • Sintaxe completa e comentada do comando CREATE USER, incluindo autenticação por senha, tablespaces, quotas, profiles e estado de conta;
  • Utilização dos comandos GRANT e REVOKE para privilégios de sistema, privilégios de objeto e roles;
  • Como criar e gerenciar roles para organizar conjuntos de permissões;
  • Procedimentos para auditar e verificar permissões concedidas usando DBA_USERS, DBA_SYS_PRIVS, DBA_ROLE_PRIVS e DBA_TAB_PRIVS;
  • Boas práticas de Gerenciamento de usuários aplicadas a ambientes de produção e desenvolvimento;
  • Resolução dos erros Oracle mais comuns ao executar CREATE USER, GRANT e REVOKE.

Pré-requisitos e Ambiente

Antes de iniciar os procedimentos desta aula, você precisa ter acesso a uma instância Oracle Database em versão 19c, 21c ou 23ai. Recomendamos fortemente o uso de um ambiente de testes isolado, de preferência uma instância pluggable database (PDB) dentro de uma container database (CDB), pois permite praticar sem comprometer bases produtivas. Você deverá possuir credenciais com privilégios administrativos, como SYS ou SYSTEM, ou um usuário com o role DBA.

O cliente de linha de comando SQL*Plus ou SQLcl deve estar instalado e configurado para conexão com o banco. Em nossos laboratórios da JRT Technology Solutions, utilizamos SQL*Plus em servidores Linux e também SQLcl em estações de trabalho Windows. Os exemplos desta aula foram validados em Oracle Database 19c e 23ai, mas a sintaxe é compatível com versões 12c e superiores.

Se você estiver executando o cliente em um ambiente Ubuntu/Debian, é comum instalar o Oracle Instant Client e o SQL*Plus a partir dos pacotes fornecidos pela Oracle. Se estiver em CentOS/RHEL/Rocky Linux, utilize os pacotes RPM oficiais. Verifique a instalação com os comandos abaixo:

# No Ubuntu/Debian
which sqlplus
sqlplus -V

# No CentOS/RHEL/Rocky Linux
rpm -qa | grep oracle-instantclient
sqlplus -V

A saída esperada deve mostrar o caminho do executável e a versão do SQL*Plus. Exemplo de saída bem-sucedida:

# Ubuntu/Debian
/usr/bin/sqlplus

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Aug 25 10:40:00 2026
Version 19.3.0.0.0

# CentOS/RHEL/Rocky Linux
oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64
oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Aug 25 10:41:00 2026
Version 19.3.0.0.0

Nos exemplos, utilizaremos uma PDB chamada ORCLPDB. Caso esteja em um banco non-CDB ou em uma PDB com outro nome, ajuste os comandos de conexão e o ALTER SESSION SET CONTAINER conforme necessário. Conecte-se com um usuário administrativo e, se estiver em CDB, altere a sessão para a PDB correta:

-- Conectando como SYSTEM na PDB ORCLPDB
sqlplus system/YourPassword@//localhost:1521/ORCLPDB

-- Se estiver conectado à CDB raiz (CDB$ROOT), altere para a PDB
ALTER SESSION SET CONTAINER = ORCLPDB;

Ao executar o ALTER SESSION SET CONTAINER, a mensagem Session altered. indica que todos os comandos subsequentes da sessão serão executados dentro da PDB especificada. Isso é fundamental para que o Gerenciamento de usuários seja feito no ambiente desejado, e não na CDB raiz, onde as regras são diferentes.

Conceitos Fundamentais: Users, Schemas, Privilégios e Roles

No Oracle, usuário e schema são conceitos profundamente interligados, mas não idênticos. Toda vez que você cria um usuário com o comando CREATE USER, o Oracle cria automaticamente um schema com o mesmo nome. O schema é um namespace lógico que agrupa objetos como tabelas, views, índices, procedimentos e sequências. O usuário, por sua vez, é a entidade de autenticação que permite estabelecer uma sessão no banco. Em outras palavras, o usuário é quem acessa; o schema é o conjunto de objetos que ele possui.

Essa separação conceitual é importante porque um usuário pode acessar objetos de outros schemas desde que receba privilégios de objeto para tal. Por exemplo, o usuário APP_USER pode consultar as tabelas do schema APP_DATA se o administrador conceder SELECT sobre APP_DATA.ORDERS. Sem essa concessão, mesmo o dono de outro schema não terá acesso. O Oracle adota o princípio de menor privilégio: nada é acessível a menos que seja explicitamente concedido.

Os privilégios no Oracle dividem-se em duas grandes categorias: privilégios de sistema e privilégios de objeto. Privilégios de sistema são ações globais, como CREATE SESSION (conectar-se ao banco), CREATE TABLE ou CREATE VIEW. Privilégios de objeto são permissões sobre objetos específicos, como SELECT, INSERT, UPDATE e DELETE em uma tabela ou view. A tabela a seguir resume essas categorias:

Tipo de Privilégio Exemplos Escopo de Aplicação
Privilégio de sistema CREATE SESSION, CREATE TABLE, CREATE PROCEDURE Permite executar ações no banco de dados como um todo
Privilégio de objeto SELECT, INSERT, UPDATE, DELETE Permite acessar ou modificar objetos específicos de um schema
Role CONNECT, RESOURCE, DBA, roles customizadas Agrupa privilégios de sistema e/ou de objeto para facilitar a gestão

O Oracle oferece ainda as roles, que são coleções nomeadas de privilégios. Em vez de conceder dezenas de privilégios individualmente a cada usuário, você concede uma role que encapsula esses privilégios. Quando uma role é concedida a um usuário, ele herda os privilégios que ela contém. Isso simplifica a administração e reduz erros. Por exemplo, a role RESOURCE inclui privilégios para criar objetos de schema, enquanto a role DBA é extremamente poderosa e deve ser reservada a administradores.

Outro ponto essencial é o conceito de quota de tablespace. Um usuário pode até possuir o privilégio CREATE TABLE, mas só conseguirá criar tabelas se tiver quota no tablespace default ou em outro tablespace especificado. A quota define o limite máximo de espaço que os objetos do schema podem ocupar. Sem quota, ocorre o erro ORA-01950: no privileges on tablespace. Por isso, o Gerenciamento de usuários exige atenção simultânea a autenticação, privilégios, roles, tablespaces e quotas.

CREATE USER: Sintaxe Completa e Boas Práticas

O comando CREATE USER é o ponto de partida de todo Gerenciamento de usuários no Oracle. Sua sintaxe pode parecer extensa, mas cada cláusula tem uma finalidade clara de segurança e organização. Veja um exemplo completo, com comentários explicativos em linha:

-- Criação do usuário APP_USER com política de senha forte e tablespace definida
CREATE USER app_user
  IDENTIFIED BY "SenhaSegura#2026"      -- Autenticação por senha; valores especiais entre aspas
  DEFAULT TABLESPACE users               -- Tablespace padrão para objetos criados pelo schema
  TEMPORARY TABLESPACE temp              -- Tablespace temporária para operações de ordenação e hash
  QUOTA 100M ON users                    -- Limite de 100 MB para objetos no tablespace USERS
  QUOTA 50M ON data_ts                   -- Limite adicional de 50 MB no tablespace DATA_TS
  PROFILE app_profile                    -- Profile com políticas de senha e recursos
  ACCOUNT UNLOCK                         -- Conta desbloqueada e pronta para uso

A cláusula IDENTIFIED BY define a senha do usuário. Você pode usar IDENTIFIED EXTERNALLY para autenticação externa via sistema operacional ou IDENTIFIED GLOBALLY para autenticação via diretório corporativo. No exemplo, usamos uma senha com caracteres especiais entre aspas duplas. Essa é uma boa prática para garantir compatibilidade com políticas de senha e evitar interpretações incorretas de caracteres como # ou @.

A cláusula DEFAULT TABLESPACE determina onde os objetos do schema serão criados, caso o comando CREATE TABLE não especifique um tablespace. A TEMPORARY TABLESPACE é usada para armazenar resultados intermediários de ordenações e junções; se omitida, o Oracle usa a tablespace temporária padrão do banco. As quotas, definidas por QUOTA, são obrigatórias para que o usuário consiga consumir espaço nos tablespaces informados. Cada QUOTA pode definir um valor em bytes, K, M, G ou T, ou UNLIMITED.

O PROFILE é um grande aliado da segurança. Ele permite impor políticas de senha, como complexidade, tempo de expiração e número de tentativas permitidas, além de limites de recursos como CPU e sessões concorrentes. Se você omitir a cláusula PROFILE, o Oracle aplica o perfil DEFAULT. Por fim, ACCOUNT UNLOCK garante que a conta seja criada desbloqueada. O oposto seria ACCOUNT LOCK, útil quando se deseja criar usuários temporariamente inativos. Após a execução, o Oracle retorna a mensagem User created.

A tabela abaixo resume as cláusulas mais relevantes do CREATE USER:

Cláusula Descrição Exemplo
IDENTIFIED BY Define autenticação por senha IDENTIFIED BY “Senha#2026”
DEFAULT TABLESPACE Tablespace padrão para objetos do schema DEFAULT TABLESPACE users
TEMPORARY TABLESPACE Tablespace temporária para operações de ordenação TEMPORARY TABLESPACE temp
QUOTA Limite de espaço no tablespace QUOTA 100M ON users
PROFILE Perfil de senha e recursos PROFILE app_profile
ACCOUNT Estado da conta (LOCK/UNLOCK) ACCOUNT UNLOCK

Para ambientes com requisitos rigorosos, recomendamos criar um profile dedicado antes do usuário. Exemplo:

-- Criando um profile com política de senha
CREATE PROFILE app_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LOCK_TIME 1
  PASSWORD_LIFE_TIME 90
  PASSWORD_REUSE_TIME 365
  PASSWORD_REUSE_MAX 5
  PASSWORD_VERIFY_FUNCTION ora12c_verify_function
  PASSWORD_GRACE_TIME 7;

O profile acima limita a cinco tentativas de login, bloqueia a conta por um dia após exceder o limite, define a senha com validade de 90 dias, exige sete dias de carência para troca e utiliza a função de verificação ora12c_verify_function, que impõe complexidade mínima. Esse nível de controle é o que nossos especialistas da JRT Technology Solutions costumam implantar em clientes que precisam atender a normas como PCI-DSS e LGPD.

GRANT: Concedendo Privilégios e Roles

Depois de criar o usuário, o próximo passo no Gerenciamento de usuários é conceder os privilégios necessários para que a conta seja útil. O comando GRANT é usado para atribuir privilégios de sistema, privilégios de objeto e roles. A sintaxe básica para privilégios de sistema é GRANT <privilégio> TO <usuário>, e para privilégios de objeto, GRANT <privilégio> ON <objeto> TO <usuário>.

Considere um cenário prático: o usuário APP_USER precisa se conectar ao banco, criar tabelas, views e sequências no seu próprio schema, e também deve ter acesso de leitura e escrita à tabela ORDERS do schema APP_DATA. Execute:

-- Concedendo privilégios de sistema ao APP_USER
GRANT CREATE SESSION TO app_user;       -- Permite conexão com o banco
GRANT CREATE TABLE TO app_user;         -- Permite criar tabelas
GRANT CREATE VIEW TO app_user;          -- Permite criar views
GRANT CREATE SEQUENCE TO app_user;      -- Permite criar sequências
GRANT CREATE PROCEDURE TO app_user;     -- Permite criar procedures e funções

-- Concedendo privilégios de objeto sobre a tabela APP_DATA.ORDERS
GRANT SELECT, INSERT, UPDATE, DELETE ON app_data.orders TO app_user;

Após a execução, o SQL*Plus retorna Grant succeeded. para cada comando. A concessão de privilégios de sistema pode incluir a opção WITH ADMIN OPTION, que permite ao usuário repassar o privilégio a terceiros. Para privilégios de objeto, a opção equivalente é WITH GRANT OPTION. Ambas ampliam o poder do usuário e devem ser evitadas em contas de aplicação, pois dificultam o controle e a revogação.

As roles são o instrumento ideal para evitar a concessão individual repetitiva. Suponha que você tenha vários usuários de aplicação que precisam dos mesmos privilégios. Em vez de digitar seis comandos GRANT para cada um, crie uma role e conceda a ela os privilégios. Depois, basta conceder a role ao usuário:

-- Criando a role APP_DEV_ROLE
CREATE ROLE app_dev_role;

-- Concedendo privilégios à role
GRANT CREATE SESSION TO app_dev_role;
GRANT CREATE TABLE TO app_dev_role;
GRANT CREATE VIEW TO app_dev_role;
GRANT CREATE SEQUENCE TO app_dev_role;

-- Concedendo a role ao usuário
GRANT app_dev_role TO app_user;

Entre as roles predefinidas, as mais conhecidas são CONNECT e RESOURCE. No passado, CONNECT incluía vários privilégios, mas a partir do Oracle 10g, apenas CREATE SESSION permaneceu. A role RESOURCE contém privilégios para criar objetos de schema, mas não inclui CREATE SESSION, por isso as duas costumam ser concedidas juntas para usuários desenvolvedores. No entanto, recomendamos criar roles customizadas com o mínimo necessário, evitando a concessão de DBA a qualquer custo.

REVOKE: Revogação Segura e Eficaz

O reverso do GRANT é o REVOKE. Esse comando remove privilégios de sistema, privilégios de objeto ou roles de um usuário. A sintaxe é análoga à de concessão: REVOKE <privilégio> FROM <usuário> para privilégios de sistema; REVOKE <privilégio> ON <objeto> FROM <usuário> para privilégios de objeto; e REVOKE <role> FROM <usuário> para roles.

Veja um exemplo de revogação em um ambiente onde o usuário APP_USER não deve mais criar procedures e deve perder o direito de modificar a tabela ORDERS:

-- Revogando privilégio de sistema do APP_USER
REVOKE CREATE PROCEDURE FROM app_user;

-- Revogando privilégios de objeto do APP_USER
REVOKE INSERT, UPDATE, DELETE ON app_data.orders FROM app_user;

O Oracle responde com Revoke succeeded. para cada comando. É importante entender que a revogação de um privilégio de sistema com ADMIN OPTION não é propagada em cascata por padrão. Se o usuário repassou o privilégio a outro usuário, a revogação no usuário original não remove o privilégio do terceiro. Já para privilégios de objeto com GRANT OPTION, a revogação é recursiva, removendo também das contas que receberam a concessão por intermédio do usuário.

Quando você revoga uma role de um usuário, todos os privilégios que a role fornecia deixam de valer imediatamente na próxima execução de comandos. Contudo, sessões já estabelecidas podem continuar funcionando até serem encerradas, dependendo do contexto. Para Gerenciamento de usuários seguro, recomenda-se revogar primeiro o acesso à sessão (REVOKE CREATE SESSION) ou executar ALTER USER … ACCOUNT LOCK se a intenção for impedir acesso imediato.

Outra operação comum é revogar quotas de tablespace. Isso não é feito com REVOKE, mas com ALTER USER e QUOTA 0. Exemplo: ALTER USER app_user QUOTA 0 ON users; impede que o usuário crie novos objetos no tablespace USERS. Para remover completamente a capacidade de conexão, combine REVOKE CREATE SESSION com ALTER USER app_user ACCOUNT LOCK.

Passo a Passo Completo: Gerenciamento de usuários na prática

Agora que já vimos a sintaxe de cada comando separadamente, vamos consolidar o conhecimento em um fluxo completo, reproduzível do início ao fim. O objetivo é criar uma role de aplicação, criar um usuário com profile e quotas, conceder acesso e testar a conexão. Em seguida, executaremos verificações de auditoria. Este é exatamente o tipo de rotina que nossos consultores da JRT Technology Solutions executam em implantações de ambientes de desenvolvimento e produção.

  1. Conecte-se ao banco como administrador na PDB desejada. Execute sqlplus system/YourPassword@//localhost:1521/ORCLPDB e, se necessário, ALTER SESSION SET CONTAINER = ORCLPDB;
  2. Crie uma role para agrupar privilégios de aplicação. Use CREATE ROLE app_dev_role;
  3. Conceda privilégios de sistema à role. Execute GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE SEQUENCE TO app_dev_role;
  4. Crie o perfil de segurança. Execute CREATE PROFILE app_profile LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LIFE_TIME 90 PASSWORD_REUSE_TIME 365 PASSWORD_GRACE_TIME 7;
  5. Crie o usuário com tablespaces, quotas e perfil. Execute o bloco de criação completo apresentado anteriormente.
  6. Conceda a role ao usuário. Execute GRANT app_dev_role TO app_user;
  7. Conceda privilégios de objeto específicos. Execute GRANT SELECT, INSERT, UPDATE, DELETE ON app_data.orders TO app_user;
  8. Verifique as concessões e o estado da conta. Consulte as tabelas administrativas DBA_USERS, DBA_ROLE_PRIVS e DBA_SYS_PRIVS.
  9. Teste a conexão com o novo usuário. Abra uma nova sessão SQL*Plus e conecte-se como APP_USER.
  10. Revogue privilégios de teste e encerre a sessão administrativa. Execute revogações conforme necessidade e documente as mudanças.

O bloco de código a seguir reúne os comandos essenciais do fluxo, prontos para execução sequencial em um ambiente de laboratório:

-- Passo 1: Conectar e selecionar a PDB (se aplicável)
-- sqlplus system/YourPassword@//localhost:1521/ORCLPDB
ALTER SESSION SET CONTAINER = ORCLPDB;

-- Passo 2: Criar role de aplicação
CREATE ROLE app_dev_role;

-- Passo 3: Conceder privilégios de sistema à role
GRANT CREATE SESSION TO app_dev_role;
GRANT CREATE TABLE TO app_dev_role;
GRANT CREATE VIEW TO app_dev_role;
GRANT CREATE SEQUENCE TO app_dev_role;

-- Passo 4: Criar perfil de segurança
CREATE PROFILE app_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LIFE_TIME 90
  PASSWORD_REUSE_TIME 365
  PASSWORD_GRACE_TIME 7;

-- Passo 5: Criar o usuário
CREATE USER app_user
  IDENTIFIED BY "SenhaSegura#2026"
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA 100M ON users
  PROFILE app_profile
  ACCOUNT UNLOCK;

-- Passo 6: Conceder a role ao usuário
GRANT app_dev_role TO app_user;

-- Passo 7: Conceder privilégios de objeto
GRANT SELECT, INSERT, UPDATE, DELETE ON app_data.orders TO app_user;

Após a execução, a saída esperada no SQL*Plus deve ser semelhante a esta:

Session altered.

Role created.

Grant succeeded.

Grant succeeded.

Grant succeeded.

Grant succeeded.

Profile created.

User created.

Grant succeeded.

Grant succeeded.

Observe que cada comando retorna uma confirmação clara. Em uma sessão interativa, você pode usar SHOW ERRORS se algum comando PL/SQL apresentar falha, mas os comandos DDL acima não geram erros de compilação. Agora, com o usuário criado e os privilégios concedidos, o próximo passo é validar se tudo está funcional por meio de consultas de verificação.

Verificando a Instalação / Testando a Configuração

A verificação é a etapa mais importante para garantir que o Gerenciamento de usuários foi executado corretamente. Utilizamos o dicionário de dados administrativo, acessível apenas por usuários com privilégios DBA. As principais tabelas são DBA_USERS, DBA_SYS_PRIVS, DBA_ROLE_PRIVS, DBA_TAB_PRIVS e DBA_TS_QUOTAS. Vamos executar um conjunto de consultas para validar a criação do usuário APP_USER.

-- Verificando dados do usuário
COL username FORMAT A20
COL account_status FORMAT A16
COL default_tablespace FORMAT A20
COL temporary_tablespace FORMAT A20
SELECT username, account_status, default

Quer aprender na prática com especialistas?

A JRT Technology Solutions oferece treinamentos e implementação de Oracle SQL para equipes corporativas.



Falar no WhatsApp

Thiago Paes Rodrigues

Com mais de 22 anos de experiência em Tecnologia da Informação, este profissional construiu uma trajetória sólida como empresário, atuando de forma estratégica na implementação de soluções tecnológicas que otimizam processos e impulsionam resultados em diferentes setores.