Criar e gerenciar esquemas nomeados

Nesta página, descrevemos como criar, usar e descartar esquemas nomeados e como aplicar controle de acesso refinado a objetos nesses esquemas. Para informações gerais sobre esquemas nomeados, consulte Esquemas nomeados.

Antes de começar

Para executar os procedimentos nesta página, você precisa do seguinte:

Criar um esquema nomeado

O comando CREATE SCHEMA (GoogleSQL e PostgreSQL) é usado para criar um esquema nomeado.

  1. No console do Google Cloud, abra a página Spanner.

    Acessar o Spanner

  2. Selecione uma instância na lista.

  3. Selecione um banco de dados.

  4. No menu de navegação, clique em Spanner Studio.

  5. Abra uma nova guia clicando em Nova guia do editor SQL ou Nova guia.

  6. Na guia Editor, insira o DDL.

    GoogleSQL

    Execute a instrução CREATE SCHEMA para criar o esquema nomeado, por exemplo:

    CREATE SCHEMA sch1;
    

    Adicione objetos de banco de dados no esquema nomeado, por exemplo:

    CREATE SEQUENCE sch1.sequence OPTIONS (
      sequence_kind = 'bit_reversed_positive'
    );
    
    CREATE TABLE Singers (
      SingerId INT64 NOT NULL,
      FirstName STRING(1024),
      LastName STRING(1024),
      SingerInfo BYTES(MAX),
    ) PRIMARY KEY(SingerId);
    
    CREATE INDEX indexOnSingers ON Singers(FirstName);
    
    CREATE TABLE Albums (
      SingerId INT64 NOT NULL,
      AlbumId INT64 NOT NULL,
      AlbumTitle STRING(MAX),
    ) PRIMARY KEY(SingerId, AlbumId),
      INTERLEAVE IN PARENT Singers ON DELETE CASCADE;
    
    CREATE TABLE Songs (
      SingerId INT64 NOT NULL,
      AlbumId INT64 NOT NULL,
      TrackId INT64 NOT NULL,
      SongName STRING(MAX),
    ) PRIMARY KEY(SingerId, AlbumId, TrackId),
      INTERLEAVE IN PARENT Albums ON DELETE CASCADE;
    
    CREATE TABLE sch1.Singers (
      SingerId INT64 NOT NULL,
      FirstName STRING(1024),
      LastName STRING(1024),
      SingerInfo BYTES(MAX),
    ) PRIMARY KEY(SingerId);
    
    CREATE INDEX sch1.indexOnSingers ON sch1.Singers(FirstName);
    
    CREATE TABLE sch1.Albums (
      SingerId INT64 NOT NULL,
      AlbumId INT64 NOT NULL,
      AlbumTitle STRING(MAX),
    ) PRIMARY KEY(SingerId, AlbumId),
      INTERLEAVE IN PARENT sch1.Singers ON DELETE CASCADE;
    
    CREATE TABLE sch1.Songs (
      SingerId INT64 NOT NULL,
      AlbumId INT64 NOT NULL,
      TrackId INT64 NOT NULL,
      SongName STRING(MAX),
    ) PRIMARY KEY(SingerId, AlbumId, TrackId),
      INTERLEAVE IN PARENT sch1.Albums ON DELETE CASCADE;
    
    CREATE VIEW sch1.SingerView SQL SECURITY INVOKER
      AS Select s.FirstName, s.LastName, s.SingerInfo
      FROM sch1.Singers AS s WHERE s.SingerId = 123456;
    
    CREATE VIEW SingerView SQL SECURITY INVOKER
      AS Select s.FirstName, s.LastName, s.SingerInfo
      FROM Singers AS s WHERE s.SingerId = 123456;
    

    O Spanner só permite criar um índice que usa o mesmo esquema da tabela que usa o índice. Precisamos garantir que os nomes dos esquemas de índice e tabela sejam os mesmos.

    PostgreSQL

    Execute a instrução CREATE SCHEMA para criar o esquema nomeado, por exemplo:

    CREATE SCHEMA sch1;
    

    Adicione objetos de banco de dados no esquema nomeado, por exemplo:

    CREATE SEQUENCE sch1.sequence BIT_REVERSED_POSITIVE
    CREATE TABLE sch1.singers(
      singer_id bigint primary key, album_id bigint default(nextval('sch1.sequence')))
    CREATE TABLE sch1.albums(k bigint default(nextval('sch1.sequence'))primary key, album_id bigint)
    
    CREATE VIEW sch1.singer_view SQL SECURITY INVOKER
      AS SELECT * FROM sch1.singers
    CREATE INDEX index_singers ON TABLE sch1.singers(album_id)
    

    O Spanner só permite a criação de índices no mesmo esquema. No Spanner, as instruções do PostgreSQL fazem isso por padrão. Não é necessário usar nomes totalmente qualificados para criar índices em esquemas nomeados.

  7. Confira os esquemas nomeados e os objetos relacionados no painel Explorer.

Adicionar controle de acesso detalhado a um esquema nomeado

As instruções DDL a seguir adicionam controle de acesso detalhado a um esquema nomeado:

  • O privilégio USAGE concede privilégios ao objeto do esquema. O privilégio USAGE é concedido, por padrão, ao esquema padrão. No entanto, é possível revogar o privilégio USAGE do esquema padrão. Tenha cuidado ao revogar o acesso, porque usuários e papéis revogados perdem todo o acesso a objetos no esquema padrão.
  • A instrução ALL executa privilégios de concessão em massa em TODOS os objetos de um tipo no esquema.
  • A palavra-chave DEFAULT se refere ao esquema padrão nas instruções DDL da FGAC.

Para acessar um objeto em um esquema nomeado, você precisa ter permissão de uso no esquema nomeado e permissões correspondentes nos objetos de banco de dados que usam esse esquema. As instruções a seguir fornecem essas permissões:

  • GRANT ALL (GoogleSQL e PostgreSQL) concede a permissão de papel para acessar todos os objetos na tabela criada com o esquema nomeado. Essa instrução só se aplica a objetos que existem naquele momento. Se você adicionar mais objetos à tabela mais tarde, precisará conceder acesso a esses objetos à medida que os cria.
  • GRANT USAGE (GoogleSQL e PostgreSQL) concede a permissão do papel para acessar objetos contidos no esquema. Isso permite que o beneficiário procure objetos no esquema.
  1. No console do Google Cloud, abra a página Spanner.

    Acessar o Spanner

  2. Selecione uma instância na lista.

  3. Selecione um banco de dados.

  4. No menu de navegação, clique em Spanner Studio.

  5. Abra uma nova guia clicando em Nova guia do editor SQL ou Nova guia.

  6. Na guia Editor, insira o DDL.

    GoogleSQL

    Crie o papel personalizado para o esquema nomeado. No exemplo a seguir, usamos role1 e role2.

    CREATE ROLE role1
    CREATE ROLE role2
    

    Conceda o papel às tabelas que usam o esquema nomeado usando GRANT ALL. No exemplo a seguir, usamos sch1 para o esquema nomeado e role1 para o papel.

    GRANT SELECT ON ALL TABLES IN SCHEMA sch1 TO ROLE role1
    

    Conceda o uso no esquema para os papéis que você criou. No exemplo a seguir, concedemos o uso em sch1 a role1 e role2.

    GRANT USAGE ON SCHEMA sch1 TO ROLE role1, role2
    

    PostgreSQL

    Crie o papel personalizado para o esquema nomeado. No exemplo a seguir, usamos role1 e role2.

    CREATE ROLE role1
    CREATE ROLE role2
    

    Conceda o papel às tabelas que usam o esquema nomeado usando GRANT ALL. No exemplo a seguir, usamos sch1 para o esquema nomeado e role1 para o papel.

    GRANT SELECT ON ALL TABLES IN SCHEMA sch1 TO role1
    

    Conceda o uso no esquema para os papéis que você criou. No exemplo a seguir, concedemos o uso em sch1 a role1 e role2.

    GRANT USAGE ON SCHEMA sch1 TO role1, role2
    

Adicionar e revogar o controle de acesso detalhado a um esquema padrão

Quando você tem esquemas nomeados, o esquema padrão é chamado de default. É preciso usar o nome do esquema default ao adicionar ou revogar o controle de acesso detalhado.

Adicionar controle de acesso detalhado a um esquema padrão

Por padrão, todos os usuários e papéis têm a permissão USAGE no esquema padrão.

  1. No console do Google Cloud, abra a página Spanner.

    Acessar o Spanner

  2. Selecione uma instância na lista.

  3. Selecione um banco de dados.

  4. No menu de navegação, clique em Spanner Studio.

  5. Abra uma nova guia clicando em Nova guia do editor SQL ou Nova guia.

  6. Na guia Editor, insira o DDL.

    GoogleSQL

    No exemplo a seguir, concedemos acesso a todas as tabelas para role1.

    GRANT SELECT ON ALL TABLES IN SCHEMA default TO ROLE role1
    

    PostgreSQL

    No exemplo a seguir, concedemos acesso a todas as tabelas para role1.

    GRANT SELECT ON ALL TABLES IN SCHEMA default TO role1
    

Revogar o controle de acesso detalhado de um esquema padrão

É possível revogar as permissões de controle de acesso detalhado no esquema padrão usando o comando REVOKE USAGE.

  1. No console do Google Cloud, abra a página Spanner.

    Acessar o Spanner

  2. Selecione uma instância na lista.

  3. Selecione um banco de dados.

  4. No menu de navegação, clique em Spanner Studio.

  5. Abra uma nova guia clicando em Nova guia do editor SQL ou Nova guia.

  6. Na guia Editor, insira o DDL.

    GoogleSQL

    REVOKE USAGE ON SCHEMA DEFAULT FROM ROLE public
    

    PostgreSQL

    REVOKE USAGE ON SCHEMA public FROM public
    
  7. Depois que o comando anterior for executado, será preciso conceder explicitamente permissões aos papéis que precisam acessar o esquema padrão. No exemplo abaixo, concedemos permissões para role1.

    GoogleSQL

    No exemplo a seguir, concedemos acesso ao esquema padrão para role1.

    SCHEMA default to ROLE role1
    

    PostgreSQL

    No exemplo a seguir, concedemos acesso ao esquema padrão para role1.

    GRANT USAGE ON SCHEMA public To role1
    

Ver esquemas nomeados

  1. Selecione uma instância na lista.
  2. Selecione um banco de dados.
  3. No menu de navegação, clique em Spanner Studio.
  4. No painel Explorador, expanda a lista suspensa Esquemas.

    Explorador com a lista de esquemas expandida

Como alternativa, é possível usar o SQL para visualizar todos os esquemas na tabela information_schema.schemata.

No exemplo a seguir, mostramos como os esquemas de nomes de visualizações e os proprietários deles:

SELECT schema_name, schema_owner
  FROM information_schema.schemata
  ORDER BY schema_owner

Essa instrução fornece uma lista de esquemas e proprietários, semelhante à seguinte:

public spanner_admin
products  spanner_admin
analytics  spanner_admin
logs  spanner_admin
pg_catalog spanner_system
information_schema spanner_system
spanner_sys   spanner_system

Remover um esquema nomeado

O comando DROP SCHEMA (GoogleSQL e PostgreSQL) é usado para descartar um esquema nomeado.

  1. No console do Google Cloud, abra a página Spanner.

    Acessar o Spanner

  2. Selecione uma instância na lista.

  3. Selecione um banco de dados.

  4. No menu de navegação, clique em Spanner Studio.

  5. Abra uma nova guia clicando em Nova guia do editor SQL ou Nova guia.

  6. Na guia Editor, insira o DDL.

    GoogleSQL

    No exemplo abaixo, descartamos sch1.

    DROP SCHEMA IF EXISTS sch1;
    

    PostgreSQL

    No exemplo abaixo, descartamos sch1.

    DROP SCHEMA IF EXISTS sch1;
    

A seguir