This post is also available in:
Você tenta criar uma tabela com coluna de identidade e o Oracle responde com erro de privilégio — mesmo que você tenha CREATE TABLE. Veja por que isso acontece e como resolver.
SQL> CREATE TABLE pedidos (
2 id INT GENERATED BY DEFAULT AS IDENTITY,
3 desc VARCHAR2(100)
4 );
id INT GENERATED BY DEFAULT AS IDENTITY,
*
ERROR at line 2:
ORA-01031: insufficient privilegesO erro aparece mesmo com CREATE TABLE concedido. O problema está em outro privilégio que passa despercebido.
Por Que Acontece
Colunas IDENTITY foram introduzidas no Oracle 12c como um atalho para o padrão sequence + default. Internamente, ao criar uma coluna identity, o Oracle cria uma sequence implícita associada àquela coluna. Essa sequence é gerenciada pelo banco, mas continua sendo uma sequence — e criar uma sequence exige o privilégio CREATE SEQUENCE.
Sem ele, o CREATE TABLE falha com ORA-01031 antes mesmo de tocar na tabela em si.
Diagnóstico
Verifique os privilégios do usuário atual:
-- Privilégios de sistema da sessão atual
SELECT privilege
FROM session_privs
ORDER BY privilege;Se CREATE SEQUENCE não aparecer na lista, esse é o problema.
Para verificar um usuário específico (como DBA):
SELECT privilege
FROM dba_sys_privs
WHERE grantee = 'MEU_USUARIO'
ORDER BY privilege;Solução
Conceda o privilégio CREATE SEQUENCE ao usuário:
-- Conectado como DBA
GRANT CREATE SEQUENCE TO meu_usuario;Após a concessão, a criação da tabela funciona normalmente:
SQL> CREATE TABLE pedidos (
2 id INT GENERATED BY DEFAULT AS IDENTITY,
3 desc VARCHAR2(100)
4 );
Table created.As Três Variantes de IDENTITY — Todas Exigem CREATE SEQUENCE
O comportamento é o mesmo para as três formas de coluna identity disponíveis no Oracle 12c+:
| Variante | Comportamento | Também falha sem CREATE SEQUENCE? |
|---|---|---|
GENERATED ALWAYS AS IDENTITY | Oracle sempre gera o valor; INSERT explícito na coluna é bloqueado | ✅ Sim |
GENERATED BY DEFAULT AS IDENTITY | Oracle gera o valor por padrão; INSERT explícito é permitido | ✅ Sim |
GENERATED BY DEFAULT ON NULL AS IDENTITY | Oracle gera o valor quando o INSERT passa NULL na coluna | ✅ Sim |
Independente da variante escolhida, a sequence implícita é sempre criada — e o CREATE SEQUENCE é sempre exigido.
Como Reproduzir em Lab
-- 1. Criar usuário de teste (conectado como DBA)
CREATE USER lab_identity IDENTIFIED BY lab123;
GRANT CREATE SESSION TO lab_identity;
GRANT CREATE TABLE TO lab_identity;
-- Intencionalmente SEM CREATE SEQUENCE
-- 2. Conectar como lab_identity e reproduzir o erro
sqlplus lab_identity/lab123@ORCLPDB1
CREATE TABLE t_identidade (
id INT GENERATED BY DEFAULT AS IDENTITY,
nome VARCHAR2(50)
);
-- Esperado: ORA-01031: insufficient privileges
-- 3. Voltar como DBA e conceder CREATE SEQUENCE
CONNECT / AS SYSDBA
GRANT CREATE SEQUENCE TO lab_identity;
-- 4. Reconectar como lab_identity e confirmar a correção
sqlplus lab_identity/lab123@ORCLPDB1
CREATE TABLE t_identidade (
id INT GENERATED BY DEFAULT AS IDENTITY,
nome VARCHAR2(50)
);
-- Esperado: Table created.
-- 5. Confirmar a sequence implícita criada pelo Oracle
SELECT sequence_name, min_value, max_value, increment_by, cache_size
FROM user_sequences;
-- Limpeza
DROP TABLE t_identidade;Checklist Rápido
-- 1. Verificar privilégios da sessão
SELECT privilege FROM session_privs ORDER BY privilege;
-- 2. Conceder CREATE SEQUENCE (como DBA)
GRANT CREATE SEQUENCE TO meu_usuario;
-- 3. Recriar a tabela
CREATE TABLE minha_tabela (
id INT GENERATED BY DEFAULT AS IDENTITY,
...
);Referências
- Oracle Database SQL Language Reference — Identity Columns
- Oracle Database Security Guide — System Privileges
