Как дать привилегии новым пользователям на табличное пространство конкретного пользователя?

Допустим у меня есть пользователь Test с таблицами AA,BB,CC,DD и каким-то одним табличным пространством, которое это всё содержит.

Могу ли я создавая других пользователей, расшарить эту маленькую БД для них?

Просто как я понимаю в Oracle пользователь это по сути экземпляр БД. Но возможно я путаю. Ожидаемый мной эффект, это чтобы этими таблицами могли пользоваться несколько пользователей, а не только тот, который их создал.


Ответы (2 шт):

Автор решения: Alex R.

Доступам к таблицам одного пользователя другому управляет команда GRANT. Общий синтаксис:

GRANT <privileges> ON <object_name> TO <user_name>

Для таблиц доступна передача следующих привилегий:

Привилегии  Описание
----------  ---------
SELECT      Возможность запроса данных
INSERT      Возможность вставки записей
UPDATE      Возможность обновления записей
DELETE      Возможность удаления записей
REFERENCES  Возможность создавать внешний ключ на данную таблицу.
ALTER       Возможность выполнять оператор ALTER TABLE
INDEX       Возможность создавать индексы.
ALL         Все привилегии для таблицы

При использовании такой таблицы другим пользователем обязательно указании имени владельца таблицы (из примера TEST.AA).

Есть возможность сделать таблицу общедоступной, для этого используется специальный пользователь PUBLIC.

Для других объектов БД также можно выдать привилегии. Например, для процедур, можно выдать EXECUTE.

Документация.

→ Ссылка
Автор решения: 0xdb

Просто как я понимаю в Oracle пользователь это по сути экземпляр БД.

Нет, пользователь это схема БД. Команды, которой можно дать доступ на все объекты схемы определённому (или группе) пользователю(ей), не существует. Как выдать привелегии на отдельные объкты, см. ответ @Alex R.. Как на группу объектов, см. дальше.

Допустим, у пользователя Test созданы таблицы a,b,c:

create table a as select 1 id from dual;
create table b as select id from a;
create table c as select id from b;

Полный доступ к ним можно дать через схему PUBLIC следующим образом:

begin
    for r in (
        select owner, table_name 
        from all_tables where owner=upper('Test')
        ) loop
        execute immediate 'grant all on '||r.owner||'.'||r.table_name||' to public';
        execute immediate 'create public synonym '||r.table_name||' for '||r.owner||'.'||r.table_name;
    end loop;
end;
/

Теперь, любой пользователь может пользоваться этими таблицами почти как своими собственными:

select * from a,b,c;

        ID         ID         ID
---------- ---------- ----------
         1          1          1
→ Ссылка