Como o GaussDB(DWS) implementa o isolamento da carga de trabalho?
Isolamento da carga de trabalho
No GaussDB(DWS), você pode isolar cargas de trabalho por meio de configurações de banco de dados e esquemas. As suas diferenças são as seguintes:
- Os bancos de dados não podem se comunicar uns com os outros e compartilham muito poucos recursos. Suas conexões e permissões podem ser isoladas.
- Esquemas compartilham mais recursos do que bancos de dados. As permissões de usuário em esquemas e objetos subordinados podem ser configuradas de forma flexível usando a sintaxe GRANT e REVOKE.
É aconselhável usar esquemas para isolar serviços para conveniência e compartilhamento de recursos. Recomenda-se que os administradores de sistema criem esquemas e bancos de dados e atribuam as permissões necessárias aos usuários.
Banco de dados
Um banco de dados é uma coleção física de objetos de banco de dados. Recursos de diferentes bancos de dados são completamente isolados (exceto alguns objetos compartilhados). Os bancos de dados são usados para isolar cargas de trabalho. Objetos em bancos de dados diferentes não podem acessar uns aos outros. Por exemplo, objetos no Banco de dados B não podem ser acessados no Banco de dados A. Portanto, ao fazer logon em um cluster, você deve se conectar ao banco de dados especificado.
Esquema
Em um banco de dados, os objetos de banco de dados são logicamente divididos e isolados com base em esquemas.
Com o gerenciamento de permissões, você pode acessar e operar objetos em esquemas diferentes na mesma sessão. Esquemas contêm objetos que os aplicativos podem acessar, como tabelas, índices, dados em vários tipos, funções e operadores.
Objetos de banco de dados com o mesmo nome não podem existir no mesmo esquema, mas os nomes de objetos em esquemas diferentes podem ser os mesmos.
1 2 3 4 5 6 7 8 9 10 11 |
gaussdb=> CREATE SCHEMA myschema; CREATE SCHEMA gaussdb=> CREATE SCHEMA myschema_1; CREATE SCHEMA gaussdb=> CREATE TABLE myschema.t1(a int, b int) DISTRIBUTE BY HASH(b); CREATE TABLE gaussdb=> CREATE TABLE myschema.t1(a int, b int) DISTRIBUTE BY HASH(b); ERROR: relation "t1" already exists gaussdb=> CREATE TABLE myschema_1.t1(a int, b int) DISTRIBUTE BY HASH(b); CREATE TABLE |
Os esquemas dividem logicamente as cargas de trabalho. Essas cargas de trabalho são interdependentes com os esquemas. Portanto, se um esquema contiver objetos, excluí-lo causará erros com informações de dependência exibidas.
1 2 3 4 |
gaussdb=> DROP SCHEMA myschema_1; ERROR: cannot drop schema myschema_1 because other objects depend on it Detail: table myschema_1.t1 depends on schema myschema_1 Hint: Use DROP ... CASCADE to drop the dependent objects too. |
Quando um esquema é excluído, a opção CASCADE é usada para excluir os objetos que dependem do esquema.
1 2 3 |
gaussdb=> DROP SCHEMA myschema_1 CASCADE; NOTICE: drop cascades to table myschema_1.t1 gaussdb=> DROP SCHEMA |
Usuário/função
Os usuários e as funções são usados para implementar o controle de permissão no servidor de banco de dados (cluster). Eles são os proprietários e executores de cargas de trabalho de cluster e gerenciam todas as permissões de objeto em clusters. Uma função não está confinada em um banco de dados específico. No entanto, ao efetuar logon no cluster, ele deve especificar explicitamente um nome de usuário para garantir a transparência da operação. As permissões de um usuário para um banco de dados podem ser especificadas por meio do gerenciamento de permissões.
Um usuário é o sujeito de permissões. O gerenciamento de permissões é, na verdade, o processo de decidir se um usuário tem permissão para executar operações em objetos de banco de dados.
Gerenciamento de permissões
O gerenciamento de permissões no GaussDB(DWS) se divide em três categorias:
- Permissão do sistema
As permissões do sistema também são chamadas de atributos de usuário, incluindo SYSADMIN, CREATEDB, CREATEROLE, AUDITADMIN e LOGIN.
Elas podem ser especificadas apenas pela sintaxe CREATE ROLE ou ALTER ROLE. A permissão SYSADMIN pode ser concedida e revogada usando GRANT ALL PRIVILEGE e REVOKE ALL PRIVILEGE, respectivamente. As permissões do sistema não podem ser herdadas por um usuário de uma função e não podem ser concedidas usando o PUBLIC.
- Permissões
Conceda permissões de uma função ou usuário a uma ou mais funções ou usuários. Nesse caso, cada função ou usuário pode ser considerado como um conjunto de uma ou mais permissões de banco de dados.
Se WITH ADMIN OPTION for especificada, o membro poderá, por sua vez, conceder permissões na função a outras pessoas e revogar permissões na função também. Se uma função ou usuário concedido com determinadas permissões for alterado ou revogado, as permissões herdadas da função ou usuário também serão alteradas.
Um administrador de banco de dados pode conceder permissões e revogá-las de qualquer função ou usuário. As funções com permissão CREATEROLE podem conceder ou revogar a participação em qualquer função que não seja de administrador.
- Permissão de objeto
Permissões em um objeto de banco de dados (tabela, visão, coluna, banco de dados, função, esquema ou tablespace) podem ser concedidas a uma atribuição ou usuário. O comando GRANT pode ser usado para conceder permissões a um usuário ou função. Essas permissões concedidas são adicionadas às já existentes.
Exemplo de isolamento de esquema
Exemplo 1:
Por padrão, o proprietário de um esquema tem todas as permissões em objetos no esquema, incluindo a permissão de exclusão. O proprietário de um banco de dados tem todas as permissões em objetos no banco de dados, incluindo a permissão de exclusão. Portanto, é aconselhável controlar estritamente a criação de bancos de dados e esquemas. Crie bancos de dados e esquemas como administrador e atribua permissões relacionadas aos usuários.
- Atribua a permissão para criar esquemas no banco de dados testdb ao usuário user_1 como usuário dbadmin.
1 2
testdb=> GRANT CREATE ON DATABASE testdb to user_1; GRANT
- Alterne para o usuário user_1.
1 2
testdb=> SET SESSION AUTHORIZATION user_1 PASSWORD '********'; SET
Crie um esquema chamado myschema_2 no banco de dados testdb como user_1.
1 2
testdb=> CREATE SCHEMA myschema_2; CREATE SCHEMA
- Alterne para o administrador dbadmin.
1 2
testdb=> RESET SESSION AUTHORIZATION; RESET
Crie table t1 no esquema myschema_2 como administrador dbadmin.
1 2
testdb=> CREATE TABLE myschema_2.t1(a int, b int) DISTRIBUTE BY HASH(b); CREATE TABLE
- Alterne para o usuário user_1.
1 2
testdb=> SET SESSION AUTHORIZATION user_1 PASSWORD '********'; SET
Exclua a tabela t1 criada pelo administrador dbadmin no esquema myschema_2 como usuário user_1.
1 2
testdb=> drop table myschema_2.t1; DROP TABLE
Exemplo 2:
Devido ao isolamento lógico dos esquemas, os objetos do banco de dados precisam ser verificados tanto no nível do esquema quanto no nível do objeto.
- Conceda a permissão na tabela myschema.t1 para user_1.
1 2
gaussdb=> GRANT SELECT ON TABLE myschema.t1 TO user_1; GRANT
- Alterne para o usuário user_1.
1 2
SET SESSION AUTHORIZATION user_1 PASSWORD '********'; SET
Consulte a tabela myschema.t1.
1 2 3
gaussdb=> SELECT * FROM myschema.t1; ERROR: permission denied for schema myschema LINE 1: SELECT * FROM myschema.t1;
- Alterne para o administrador dbadmin.
1 2
gaussdb=> RESET SESSION AUTHORIZATION; RESET
Conceda a permissão na tabela myschema.t1 ao usuário user_1.
1 2
gaussdb=> GRANT USAGE ON SCHEMA myschema TO user_1; GRANT
- Alterne para o usuário user_1.
1 2
gaussdb=> SET SESSION AUTHORIZATION user_1 PASSWORD '********'; SET
Consulte a tabela myschema.t1.
1 2 3 4
gaussdb=> SELECT * FROM myschema.t1; a | b ---+--- (0 rows)