Oracle Доступ только для чтения к определенному пользователю

#oracle

#Oracle

Вопрос:

У меня есть схема и много пользователей в ней. Для разработки я хотел бы предоставить пользователю разрешение только на чтение таблиц и не иметь разрешения на управление базой данных. Существуют ли какие-либо команды для установки прав доступа для конкретного пользователя только для чтения?

Комментарии:

1. Какую базу данных вы используете? MySQL или Oracle?

2. Нет, у вас нет «схемы и многих пользователей в ней». Пользователи не входят в схемы. Пользователи владеют своей собственной схемой. Пользователь = владелец = схема. Теперь, к вашему вопросу — в oracle все запрещено, если специально не разрешено. Если вы хотите, чтобы данный пользователь имел доступ только для чтения к таблице другого пользователя (схемы), то не ПРЕДОСТАВЛЯЙТЕ этому пользователю ничего, кроме ВЫБОРА ДЛЯ OTHER_USER . ИМЯ_ТАБЛИЦЫ. Мои комментарии направлены oracle. Поскольку вы отметили 2 разных продукта rdbms, мы не знаем, о каком из них вы действительно спрашиваете.

3. @Littlefoot База данных Oracle

4. @jps Не совсем брат

5. @Tech_Delhi: вы отметили его mysql (а также C #), поэтому не удивляйтесь, если ответ не соответствует вашим потребностям. Правильный ответ для Oracle должен быть таким же простым, как и для mysql.

Ответ №1:

Как прокомментировал Эд, вам не разрешено ничего делать, если это не разрешено. Для пользователей, доступных только для чтения, вы бы предоставили только SELECT привилегию для своих таблиц. Если у вас их всего несколько, сделайте это вручную. В противном случае создайте процедуру, которая сделает это за вас. Вот пример.

Это мои таблицы:

 SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
DEPT                           TABLE
EMP                            TABLE
LINKS                          TABLE
SALGRADE                       TABLE
  

Процедура, которая перебирает все таблицы в моей схеме и предоставляет SELECT пользователю, переданному в качестве параметра:

 SQL> create or replace procedure p_grant_ro(par_user in varchar2) is
  2    l_str varchar2(200);
  3  begin
  4    for cur_r in (select table_name from user_tables
  5                  order by table_name
  6                 )
  7    loop
  8      l_str := 'grant select on ' || cur_r.table_name ||
  9               ' to ' || dbms_assert.schema_name(par_user);
 10      dbms_output.put_line(l_str);
 11      execute immediate(l_str);
 12    end loop;
 13  end;
 14  /

Procedure created.
  

Тестирование:

 SQL> set serveroutput on;
SQL> exec p_grant_ro('MIKE');
grant select on BONUS to MIKE
grant select on DEPT to MIKE
grant select on EMP to MIKE
grant select on LINKS to MIKE
grant select on SALGRADE to MIKE

PL/SQL procedure successfully completed.

SQL>
  

Если вам интересно, какова цель dbms_assert вызова функции: предотвращение возможного внедрения SQL. Функция заботится о том, чтобы параметр был именем существующей схемы.

 SQL> exec p_grant_ro('TECH_DELHI');
BEGIN p_grant_ro('TECH_DELHI'); END;

*
ERROR at line 1:
ORA-44001: invalid schema
ORA-06512: at "SYS.DBMS_ASSERT", line 266
ORA-06512: at "SCOTT.P_GRANT_RO", line 8
ORA-06512: at line 1


SQL>
  

Ответ №2:

Вы должны иметь возможность настроить это, например, в MYSQL Workbench. Я думаю, что есть также способ связать это с пользователем Apex.