Как дать привилегии новым пользователям на табличное пространство конкретного пользователя?
Допустим у меня есть пользователь Test с таблицами AA,BB,CC,DD и каким-то одним табличным пространством, которое это всё содержит.
Могу ли я создавая других пользователей, расшарить эту маленькую БД для них?
Просто как я понимаю в Oracle пользователь это по сути экземпляр БД. Но возможно я путаю. Ожидаемый мной эффект, это чтобы этими таблицами могли пользоваться несколько пользователей, а не только тот, который их создал.
Ответы (2 шт):
Доступам к таблицам одного пользователя другому управляет команда GRANT. Общий синтаксис:
GRANT <privileges> ON <object_name> TO <user_name>
Для таблиц доступна передача следующих привилегий:
Привилегии Описание
---------- ---------
SELECT Возможность запроса данных
INSERT Возможность вставки записей
UPDATE Возможность обновления записей
DELETE Возможность удаления записей
REFERENCES Возможность создавать внешний ключ на данную таблицу.
ALTER Возможность выполнять оператор ALTER TABLE
INDEX Возможность создавать индексы.
ALL Все привилегии для таблицы
При использовании такой таблицы другим пользователем обязательно указании имени владельца таблицы (из примера TEST.AA).
Есть возможность сделать таблицу общедоступной, для этого используется специальный пользователь PUBLIC.
Для других объектов БД также можно выдать привилегии. Например, для процедур, можно выдать EXECUTE.
Просто как я понимаю в 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