2017-02-17 31 views
3

В Oracle DB 11g, используя SQL Developer, я создал пользователя со связанной схемой, которая имеет только привилегии только для чтения. Теперь я хочу ограничить, чтобы новый пользователь мог просматривать другие пользователи/схемы, за исключением нескольких, которые я выбираю.Oracle SQL Developer - Как ограничить пользователя, чтобы видеть только конкретные схемы

Другими словами, когда они (в SQL Developer) переходят в папку «Другие пользователи» по своей собственной схеме, я не хочу, чтобы этот пользователь мог видеть ВСЕ других пользователей, которые находятся в этой базе данных. Я только хочу, чтобы они увидели несколько избранных.

Как вы это делаете, если это возможно?

Btw ... Я знаю, что я могу ограничить их возможностью сделать что-либо другим пользователям (например, создавать таблицы, запускать запросы и т. Д.). Тем не менее, я хочу, чтобы они не могли ПРОСМОТРЕТЬ или ПОСМОТРЕТЬ, что эти другие пользователи есть.

ответ

2

По существу, вы можете сделать только в SQL Developer то, что вы в противном случае можете сделать в базе данных.

Как сказал Алекс, SQL Developer использует SELECT из SYS.ALL_USERS, чтобы увидеть всех пользователей в системе. Это не проблема разработчиков SQL; ваш пользователь, если бы у них был доступ к SQL * Plus, мог запустить select username from sys.all_users непосредственно против базы данных и получить ту же информацию.

Удаление этой информации от пользователя осуществляется по тому же пути. Можно выбрать только SELECT из таблиц, которым была предоставлена ​​привилегия SELECT. Выбор из таблиц и представлений каталога (и, в частности, из ALL_USERS в схеме SYS) обычно является косвенным грантом: роль PUBLIC имеет привилегию SELECT из этих таблиц, и в большинстве случаев (возможно, по умолчанию? В зависимости от вашего инструмента администрирования) новые пользователям предоставляется роль ОБЩЕСТВЕННАЯ.

В зависимости от потребностей вашего бизнеса вы можете ОТКРЫТЬ ОБЩЕСТВЕННУЮ роль от выбранных пользователей (а затем создать пулы привилегий, которые вы хотите предоставить, заменить то, что они потеряют таким образом), или - более решительно, а возможно и не что вы должны сделать - вы можете просто revoke select on all_users from public; (при входе в систему с привилегией SYSDBA или некоторыми другими привилегиями, достаточными для выполнения этой операции).

Редактировать - Я только что проверил, и, к сожалению, нельзя отменить роль ОБЩЕСТВЕННОСТИ; он автоматически предоставляется всем пользователям в базе данных и не может быть изменен. Это оставляет только менее желательную альтернативу возиться с привилегиями, которыми обладает сама ОБЩЕСТВЕННОСТЬ. End редактировать

Я просто проверил это - я вошел в as sysdba отозвана выберите на SYS.ALL_USERS из PUBLIC, а затем закрыть SQL Developer и перезапустить его. Разумеется, я больше не вижу каких-либо «других пользователей» от любого пользовательского пользователя, созданного в моей базе данных (это означает, что из подключений SQL Developer, созданных для этих пользователей).

+0

Отлично. Спасибо за вашу помощь. – ptownbro

+0

@ptownbro - обратите внимание на мой ** Редактировать ** - к сожалению, PUBLIC нельзя отнять у пользователей; единственное решение - отозвать SELECT на SYS.ALL_USERS из PUBLIC, что может иметь неприятные последствия для других пользователей (и, вполне вероятно, для процессов и приложений, которым может потребоваться доступ к этой таблице). – mathguy

2

Вы не можете, в основном. Если вы посмотрите на журнал заявление в SQL Developer, как вы расширить раздел "других пользователей на панели соединений, вы увидите команду он использует это:

select * from (select USERNAME 
FROM SYS.ALL_USERS au 
WHERE au.USERNAME != USER 
); 

Совершенно новый пользователь, который только был предоставлен connect могут видеть всех пользователей, перечисленных в этом системном представлении.

Поскольку этот запрос имеет квалификацию имени объекта all_users с помощью схемы sys, вы даже не можете создать представление или частный синоним для своего пользователя, который дает ограниченный список. Хотя, конечно, пользователь сможет обойти это, если захочет.

SQL Developer позволяет фильтровать объекты в области соединений. Если щелкнуть правой кнопкой мыши на «других пользователей» и выберите "Применить фильтр ... вы увидите диалоговое окно, как:

apply filter dialog

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

select * from (select USERNAME 
FROM SYS.ALL_USERS au 
WHERE au.USERNAME != USER 
) WHERE (UPPER(USERNAME) = (UPPER(:SCHEMA)) OR UPPER(USERNAME) = (UPPER(:SCHEMA0))) 

... и это показывает параметры связывания являются "SCHEMA"="SOUSER1", "SCHEMA0"="SOUSER2"

Но вы не можете контролировать, что в центре, вы бы чтобы настроить его на копии всех экземпляров SQL Developer (возможно, вручную, хотя вы можете посмотреть на файл конфигурации), и пользователи могут легко удалить или изменить фильтр. Это влияет на клиента, а не на пользователя, и снова можно легко обойти стороной.

+0

Grrr. ОК. Поэтому, даже если я применил фильтр на моем конце, он не будет показан на их конце? Это то, что вы имеете в виду, это невозможно контролировать централизованно? – ptownbro

+0

Да, изменение фильтров или предпочтений на вашем клиенте (т. Е. Разработчик SQL на вашем ПК) не повлияет ни на кого другого. Если вы можете найти правильный конфигурационный файл и бит, который относится к фильтрам, вы можете найти способ его распространения, но не легко. (У Oracle есть VPD ... но я не уверен, может ли (или должен) применяться к системным представлениям, может быть что-то, что нужно сделать, чтобы убедиться ...) –

+0

Если вам интересно - это проблема с базой данных , а не проблема SQL Developer. Я объясняю далее в ответе, который я только что опубликовал. – mathguy

 Смежные вопросы

  • Нет связанных вопросов^_^