Как предоставить все привилегии для всех таблиц в схеме пользователю в IBM DB2?

9

Прежде всего, я хочу экспортировать базу данных из IBM DB2 AIX в окна IBM DB2. К сожалению, я не могу использовать команды BACKUP и RESTORE из-за разницы в ОС. Поэтому я должен прибегнуть к команде db2move .

Я экспортировал схему myschema и все таблицы из базы данных dbemp в удаленном IBM DB2 AIX с помощью этой команды:

db2move dbemp export -sn myschema

Когда я запустил эту команду, я вошел как пользователь с именем dbuser1 .

Он генерирует кучу файлов в текущей папке. Я беру файлы на свой локальный компьютер (Windows), на котором установлена ​​IBM DB2 LUW.

Теперь на локальном компьютере IBM DB2 я сначала удалил существующую схему myschema с помощью IBM Data Studio (у меня также была локальная база данных dbemp ).

Затем я импортировал файлы с помощью этой команды:

db2move dbemp import

Он успешно импортирует схему и таблицы в локальную базу данных dbemp .

Когда я делал вышеуказанные действия, я был авторизован как пользователь winuser1 .

У меня также есть локальный пользователь с именем dbuser1 на моей локальной машине (Windows). В IBM Data Studio я создал профиль соединения, который подключается к локальному dbemp с помощью пользователя dbuser1, и я могу просматривать схему myschema и таблицы, но не могу просмотреть данные таблицы (я получил ошибку привилегии). Пользователь winuser1 может просматривать данные таблицы, но для целей разработки мне необходимо подключиться к базе данных, используя пользователя dbuser1 .

Итак, я обнаружил, что могу предоставить привилегию пользователю на столе следующим образом:

GRANT ALL ON myschema.table1 TO USER dbuser1

Проблема в том, что у меня есть 100 таблиц, я не хочу вводить эти строки для каждой таблицы. И, к сожалению, такого подстановочного решения тоже не существует:

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

Таким образом, вопрос заключается в том, как предоставить пользователю все привилегии для всех таблиц в схеме. Или есть альтернативное лучшее решение? может быть, скопировав все привилегии из winuser1 в dbuser1 ?

значение NULL
источник

Ответы:

8

Если вы хотите получить доступ ко всем данным (т. Е. Ко всем таблицам во всех схемах), вам необходимо предоставить доступ к данным.

db2 grant dataaccess on database to user winuser1

Если вы хотите, чтобы winuser1 имел доступ только к 100 таблицам в схеме, на которую вы ссылаетесь, то, к сожалению, не существует простого способа, вам нужно предоставить SELECT для каждой таблицы. При этом, это может быть достигнуто с помощью сценариев.

Вы могли бы сделать следующее

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

Это использует запросы к системным каталогам для динамической генерации скрипта для разрешения действий. Это много из того, как мы разрешаем пользователям, которым мы не хотим предоставлять доступ к данным.

Вот хорошая страница авторитетов для DB2 .

Крис Олдрич
источник
спасибо, db2 grant dataaccessработает. Я не против предоставить их всем схемам, так как я нахожусь в среде разработки.
ноль
0

Если вы используете редактор SQL, такой как Toad, этот скрипт также может помочь. Вы можете скопировать / вставить результаты в новом окне.

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';
Джон Арик
источник
0

Вы также можете попробовать (используя редактор 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
Флорин Драган
источник