Como conceder todos os privilégios em todas as tabelas em um esquema a um usuário no IBM DB2?

9

Em primeiro lugar, desejo exportar o banco de dados do IBM DB2 AIX para o IBM DB2 windows. Infelizmente, não posso usar os comandos BACKUP e RESTORE devido à diferença no problema do SO. Então eu tenho que recorrer ao comando db2move .

Eu havia exportado o esquema de myschema e todas as tabelas do banco de dados dbemp no IBM DB2 AIX remoto usando este comando:

db2move dbemp export -sn myschema

Ao executar esse comando, eu estava logado como usuário chamado dbuser1 .

Ele gera vários arquivos na pasta atual. Pego os arquivos na minha máquina local (windows) que possui o IBM DB2 LUW instalado.

Agora, no IBM DB2 da minha máquina local, eliminei primeiro o myschema do esquema existente usando o IBM Data Studio (eu também tinha um banco de dados dbemp local ).

Então eu importei os arquivos usando este comando:

db2move dbemp import

Ele importou com sucesso o esquema e as tabelas para o banco de dados dbemp local .

Quando fiz as ações acima, estava logado como usuário winuser1 .

Eu tenho um usuário local chamado dbuser1 também na minha máquina local (windows). No IBM Data Studio, criei um perfil de conexão que se conecta ao dbemp local usando o usuário dbuser1 e posso navegar pelo esquema de myschema e pelas tabelas, mas não consigo navegar pelos dados da tabela (erro de privilégio). O usuário winuser1 pode procurar os dados da tabela, mas, para fins de desenvolvimento, tenho que me conectar ao banco de dados usando o usuário dbuser1 .

Então, descobri que posso conceder privilégios a um usuário na tabela assim:

GRANT ALL ON myschema.table1 TO USER dbuser1

O problema é que tenho 100 tabelas, não quero digitar essas linhas para cada tabela. E, infelizmente, também não existe uma solução curinga como esta:

GRANT ALL ON myschema.* TO USER dbuser1 -- this doesn't work

Portanto, a questão é como conceder todos os privilégios em todas as tabelas em um esquema a um usuário? Ou existe uma solução melhor alternativa? talvez copiando todos os privilégios do winuser1 para o dbuser1 ?

nulo
fonte

Respostas:

8

Se você deseja acessar todos os dados (ou seja, todas as tabelas em todos os esquemas), precisará conceder acesso a dados.

db2 grant dataaccess on database to user winuser1

Se você deseja que o winuser1 acesse apenas as 100 tabelas no esquema ao qual você está se referindo, infelizmente, não há uma maneira fácil, você precisará conceder o SELECT em cada tabela. Dito isto, pode ser realizado por meio de scripts.

Você pode fazer o seguinte

db2 -tnx "select distinct 'GRANT ALL ON TABLE '||
    '\"'||rtrim(tabschema)||'\".\"'||rtrim(tabname)||'\" TO USER winuser1;'
    from syscat.tables
    where tabschema = 'myschema' "  >> grants.sql

db2 -tvf grants.sql

Isso faz uso da consulta aos catálogos do sistema para gerar dinamicamente um script para permitir coisas. É assim que permitimos aos usuários que não queremos dar acesso a dados.

Aqui está uma boa página das autoridades para o DB2 .

Chris Aldrich
fonte
obrigado, db2 grant dataaccessfunciona. Não me importo de concedê-los a todos os esquemas, pois estou no ambiente de desenvolvimento.
null
0

Se você estiver usando um editor SQL como o Toad, esse script também poderá ajudar. Você pode copiar / colar os resultados em uma nova janela.

SELECT DISTINCT
      'GRANT Select ON TABLE '
   || rtrim (tabschema)
   || '.'
   || rtrim (tabname)
   || ' TO USER USERNAME;'
  FROM syscat.tables
 WHERE tabschema = 'Schema'
 UNION
 SELECT    'GRANT Select ON VIEW '
   || rtrim (VIEWSCHEMA)
   || '.'
   || rtrim (viewname)
   || ' TO USER USERNAME;'
 FROM SYSCAT.VIEWS
 WHERE VIEWSCHEMA = 'Schema';
John Arick
fonte
0

Você também pode tentar (usando um editor SQL):

BEGIN
 FOR v AS cur CURSOR FOR 
    select 
        'GRANT SELECT, INSERT, UPDATE, DELETE ON ' || trim(tabschema) || '.' || trim(tabname) || ' TO YourUser' stmt 
    from 
        syscat.tables 
    where 
        tabschema = 'YourSchema' 
  DO 
    EXECUTE IMMEDIATE v.stmt;
  END FOR;
END
Florin Dragan
fonte