CREATE SCHEMA

CREATE SCHEMA — define um novo esquema

Sinopse

CREATE SCHEMA nome_do_esquema
    [ AUTHORIZATION usuário ]
    [ objeto_do_esquema
    [ ... ] ]
CREATE SCHEMA AUTHORIZATION usuário
    [ objeto_do_esquema
    [ ... ] ]
CREATE SCHEMA IF NOT EXISTS nome_do_esquema
    [ AUTHORIZATION usuário ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION usuário

onde usuário pode ser:

    nome_do_usuário
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

Organização

Figura 3. Estrutura lógica hierárquica do PostgreSQL


Descrição

O comando CREATE SCHEMA define um novo esquema no banco de dados corrente [137] [138]. O nome do esquema deve ser diferente do nome de qualquer esquema existente no banco de dados corrente.

Um esquema é essencialmente um espaço de nomes: contém objetos com nome (tabelas, tipos de dados, funções, e operadores), cujos nomes podem duplicar aqueles de outros objetos existentes em outros esquemas. Os objetos são acessados qualificando seus nomes com o nome do esquema como prefixo, ou definindo um caminho de procura que inclua o(s) esquema(s) desejado(s). Um comando CREATE especificando um nome de objeto não qualificado pelo nome do esquema, cria o objeto no esquema corrente (aquele na frente no caminho de procura, que pode ser determinado usando a função current_schema).

Como opção, o comando CREATE SCHEMA pode incluir subcomandos para criar objetos dentro do novo esquema. Estes subcomandos são tratados essencialmente da mesma forma que os comandos executados em separado após a criação do esquema, exceto que, se for usada a cláusula AUTHORIZATION, todos os objetos criados serão de propriedade desse usuário.

Parâmetros

nome_do_esquema

O nome do esquema a ser criado. Se for omitido, será usado o nome_do_usuário como nome do esquema. O nome não pode começar com pg_, porque estes nomes são reservados para os esquemas do sistema.

nome_do_usuário

O nome da função de banco de dados (role) do usuário que será o dono do novo esquema. Se omitido, o padrão é o usuário que está executando o comando. Para criar um esquema pertencente a outra função de banco de dados, é necessário ser capaz de utilizar SET ROLE para esta outra função de banco de dados.

objeto_do_esquema

Um comando SQL definindo um objeto a ser criado no esquema. No momento, são aceitos apenas os subcomandos CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE SEQUENCE, CREATE TRIGGER e GRANT no comando CREATE SCHEMA. Podem ser criados outros tipos de objeto usando comandos distintos após a criação do esquema.

IF NOT EXISTS

Não fazer nada (exceto relatar uma advertência), se já existir um esquema com o mesmo nome. Quando esta opção é usada, não podem ser incluídos os subcomandos do objeto_do_esquema.

Nota

Para criar um esquema, o usuário deve ter o privilégio CREATE para o banco de dados corrente. (Claro, os superusuários ignoram esta verificação.)

Exemplos

Criar um esquema:

CREATE SCHEMA meu_esquema;

Criar um esquema para o usuário joe; o esquema também se chamará joe:

CREATE SCHEMA AUTHORIZATION joe;

Criar um esquema chamado teste, pertencente ao usuário joe, a menos que já exista um esquema chamado teste. (Não faz diferença se joe é o dono do esquema já existente.)

CREATE SCHEMA IF NOT EXISTS test AUTHORIZATION joe;

Criar um esquema, criando junto uma tabela e uma visão neste esquema:

CREATE SCHEMA hollywood
    CREATE TABLE films (title text, release date, awards text[])
    CREATE VIEW winners AS
        SELECT title, release FROM films WHERE awards IS NOT NULL;

Deve-se observar que os subcomandos não terminam com ponto e vírgula.

O que se segue é uma maneira equivalente de obter o mesmo resultado:

CREATE SCHEMA hollywood;
CREATE TABLE hollywood.films (title text, release date, awards text[]);
CREATE VIEW hollywood.winners AS
    SELECT title, release FROM hollywood.films WHERE awards IS NOT NULL;

Exemplo 82. Exemplo do tradutor

Esquema para os objetos do Tutorial

Neste exemplo é criado o esquema tutorial, contendo as tabelas clima e cidades do Tutorial (veja Criação de tabelas), e permitida a consulta a estas tabelas por todos (veja Privilégios).

cristina=> CREATE SCHEMA tutorial
  CREATE TABLE clima (
    cidade          varchar(80),    -- nome da cidade
    temp_min        int,            -- temperatura mínima em °C
    temp_max        int,            -- temperatura máxima em °C
    prcp            real,           -- precipitação em mm
    data            date            -- data
  )
  CREATE TABLE cidades (
    nome            varchar(80),    -- nome da cidade
    localizacao     point           -- coordenadas x, y (Longitude, Latitude)
  )
  GRANT SELECT ON clima, cidades TO public;
CREATE SCHEMA

A seguir estão listadas as relações e privilégios de acesso do esquema tutorial:

cristina=> \dt tutorial.*
             List of tables
 Esquema  |  Nome   |  Tipo  |   Dono
----------+---------+--------+----------
 tutorial | cidades | tabela | cristina
 tutorial | clima   | tabela | cristina
(2 linhas)
cristina=> \dp tutorial.*
                                    Privilégios de acesso
 Esquema  |  Nome   |  Tipo  |   Privilégios de acesso    | Privilégios de coluna | Políticas
----------+---------+--------+----------------------------+-----------------------+-----------
 tutorial | cidades | tabela | cristina=arwdDxtm/cristina+|                       |
          |         |        | =r/cristina                |                       |
 tutorial | clima   | tabela | cristina=arwdDxtm/cristina+|                       |
          |         |        | =r/cristina                |                       |
(2 linhas)

A seguir estão listados todos os esquemas no banco de dados corrente aos quais o usuário corrente tem acesso:

cristina=> SELECT catalog_name, schema_name, schema_owner
             FROM information_schema.schemata;
 catalog_name |    schema_name     |   schema_owner
--------------+--------------------+-------------------
 cristina     | information_schema | postgres
 cristina     | pg_catalog         | postgres
 cristina     | public             | pg_database_owner
 cristina     | tutorial           | cristina
(4 linhas)

Conformidade

O padrão SQL aceita a cláusula DEFAULT CHARACTER SET no comando CREATE SCHEMA, bem como mais tipos de subcomandos do que os atualmente aceitos pelo PostgreSQL.

O padrão SQL especifica que os subcomandos em CREATE SCHEMA podem aparecer em qualquer ordem. A implementação corrente do PostgreSQL não lida com todos os casos de referências à frente em subcomandos; às vezes pode ser necessário reordenar os subcomandos, para evitar referências à frente.

Segundo o padrão SQL, o dono do esquema é sempre o dono de todos os objetos dentro dele. O PostgreSQL permite que esquemas contenham objetos pertencentes a usuários que não sejam o dono do esquema. Isto pode acontecer apenas se o dono do esquema conceder o privilégio CREATE em seu esquema para outro usuário, ou se um superusuário optar por criar objetos nele.

A opção IF NOT EXISTS é uma extensão do PostgreSQL.

Veja também

ALTER SCHEMA, DROP SCHEMA, schemata


[137] Use o comando CREATE SCHEMA para criar várias tabelas e visões e executar várias concessões em seu próprio esquema em uma única transação. Nota: Este comando não cria realmente um esquema. O banco de dados Oracle cria automaticamente o esquema quando o usuário é criado. Este comando permite que o usuário preencha seu esquema com tabelas e visões, e conceda privilégios a estes objetos, sem precisar executar vários comandos SQL em várias transações. Oracle 21 – CREATE SCHEMA (N. T.)

[138] O comando CREATE SCHEMA define um esquema. Também é possível criar alguns objetos e conceder privilégios a objetos dentro do comando. IBM DB2 12.1.x – CREATE SCHEMA statement (N. T.)