powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / А можно в Oracle юзеру назначить схему по умолчанию?
24 сообщений из 24, страница 1 из 1
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187317
iNT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iNT
Гость
HI ALL!
А можно в Oracle юзеру назначить схему по умолчанию?
Т.е. user1 логинится, пишет select * from table1 и получает данные из таблицы table1 находящейся в схеме user2 (все гранты предварительно прописаны).
Я знаю что добиться этого можно создав синоним user1.table1 на user2.table1, но объектов у user2 много, иногда они добавляются, к тому же это надо обеспечить доступ и для user3, и для user4, и для ...
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187323
Angel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALTER SESSION SET CURRENT_SCHEMA = user2
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187345
iNT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iNT
Гость
Видимо это как раз то что нужно. Удивляет отсутствие описания ALTER SESSION SET CURRENT_SCHEMA в документации, но работает. Почти. выдает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
ORA- 02421 : missing or invalid schema authorization identifier 
Cause: Either: 
The schema authorization identifier is not recognized. 
An attempt was made to use a schema authorization identifier for a user while not connected as that user. 


Action: If the cause is 
an unrecognized identifier, then use an existing identifier. 
connected with a different user name, then disconnect and connect to the correct user name. 

Чего ему еще надо?
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187349
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё же лучше создавать public синонимы...
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187385
iNT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iNT
Гость
Чем лучше?
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187390
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем кодировать имя схемы в приложение

С таким подходом будет невозможно (без изменения кода) поднять в рамках одного инстанса несколько экземпляров приложения.
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187425
iNT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iNT
Гость
2 Scott Tiger
В приложение никто ничего писать не собирается. Сделано будет так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR REPLACE TRIGGER TG_A_LOGON
 AFTER 
 LOGON
 ON DATABASE
BEGIN
   IF ora_login_user = 'USER1'
   THEN
    ALTER SESSION SET CURRENT_SCHEMA = USER2;
   END IF;
END tg_a_logon;

Только вот синтаксическая ошибка около ALTER SESSION... где-то
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187550
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот который раз задаюсь вопросом - зачем вы.бываться, если есть хороший и проверенный веками :) способ? И не нахожу ответа...
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187570
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 iNT

Синтаксическая ошибка лезет из-за невозможности напрямую задавать DDL в PL/SQL. Надо использовать или dbms_sql или execute immediate.

2 Scott Tiger

Я тоже не понимаю, зачем. Но кому-то хочется быть не такими, как все. Покруче, что ли...
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187585
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже не понимаю, зачем. Но кому-то хочется быть не такими, как все.

Для этого случая есть пиво Тинькофф:-)
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187686
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В плане пефоманса это правильный подход. Да и вообще гораздо более логичный чем вешать public-синонимы.
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187772
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перформанс - не единственное и не самое главное. ИМХО, разумеется.
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187820
gminter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В дополнение к сказанному Scott Tiger-om:

Если лень писать public синонимы для каждого объекта, то сделать это можно и таким способом:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
declare 
  s varchar2( 1024 );  
begin
 for d in (select t.object_name from dba_objects t where t.owner = 'SCOTT')
 loop
  s := 'create or replace public synonym ' || d.object_name || ' for '  || d.object_name;
  execute immediate s;
 end loop;
end;
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187965
raven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в любом случае не забывай что привелегии на объекты все равно нужны :-)

PS По мне способ 1 лучче, хоть и не веками проверенный
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32187969
Simon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо делать не паблик а private синонимы (нафига всем юзерам видеть эти объекты??)
а гранты вешать на роль и эту роль назначать юзеру
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32188014
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Scott Tiger
> Чем кодировать имя схемы в приложение

ALTER SESSION SET CURRENT_SCHEMA можно забубенить в триггер after logon.
Зачем синонимы, если без них можно обойтись ? Меньше объектов в базе - меньше головной боли - проще сопровождение
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32188016
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"ALTER SESSION SET CURRENT_SCHEMA"

А то, что это недокументированная возможность не пугает в связи с будущими переходами на новые версии и потенциальной ситуацией, когда придёться переписывать весь код?
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32188039
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"ALTER SESSION SET CURRENT_SCHEMA"

вообще звучит как то алогично - ведь CURRENT_SCHEMA есть схема текущего юзера. /* to softbuilder */ Что current это просто слово, понимаю.

Хорошо хоть аналога переменной PATH нету - прописываешь список схем где Ораклу следует искать объекты если их нет в схеме юзера:-) Вот бы была потеха!
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32188043
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Simon, как я понял, у автора топика объекты эпизодически (или автоматически) появляются и, возможно, исчезают, что, конечно, само по себе погано, но тем не менее... В таком случае при создании каждого нового объекта для каждого пользователя приложения придётся создавать private синоним, что и геморройно, и действительно сильно загрузит словарь, если пользователей и объектов много.
Как мне думается, однозначно на этот вопрос ответить можно, только полностью зная условия задачи.
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32188062
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обратите внимание на наличие sys_context('USERENV','CURRENT_SCHEMA').
ALTER SESSION SET CURRENT_SCHEMA=... не только документировано (2softbuilder) , но и не представляется поэтому какой-то нелогичной (2Violina) по крайней мере с точки зрения программиста - есть возможность и получить, и установить.
Если приложение построено с "владельцем главной схемы", то появляется возможность делать несколько таких "главных" схем (например для разработки-отладки) без разруливания синонимами и модификации клиентских программ
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32188127
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения программиста на стадии разработки, согласна, очень удобно, сама часто этим пользуюсь. Но когда начинают это закладывать в механизм работы приложения, ИМХО это уже плохо.

Интересная дока по этому поводу из Оракл Management of Schema Objects. Может кому поможет избежать граблей.

Because of how Oracle resolves references, it is possible for an object to depend on the nonexistence of other objects. This situation occurs when the dependent object uses a reference that would be interpreted differently were another object present. For example, assume the following:

At the current point in time, the company schema contains a table named emp.
A PUBLIC synonym named emp is created for company.emp and the SELECT privilege for company.emp is granted to the PUBLIC role.

The jward schema does not contain a table or private synonym named emp.
The user jward creates a view in his schema with the following statement:

Код: plaintext
1.
2.
3.
CREATE VIEW dept_salaries AS 
     SELECT deptno, MIN(sal), AVG(sal), MAX(sal) FROM emp 
     GROUP BY deptno 
     ORDER BY deptno; 


When jward creates the dept_salaries view, the reference to emp is resolved by first looking for jward.emp as a table, view, or private synonym, none of which is found, and then as a public synonym named emp, which is found. As a result, Oracle notes that jward.dept_salaries depends on the nonexistence of jward.emp and on the existence of public.emp.

Now assume that jward decides to create a new view named emp in his schema using the following statement:

Код: plaintext
1.
2.
CREATE VIEW emp AS 
     SELECT empno, ename, mgr, deptno 
     FROM company.emp; 


Notice that jward.emp does not have the same structure as company.emp.

As it attempts to resolve references in object definitions, Oracle internally makes note of dependencies that the new dependent object has on "nonexistent" objects--schema objects that, if they existed, would change the interpretation of the object's definition. Such dependencies must be noted in case a nonexistent object is later created. If a nonexistent object is created, all dependent objects must be invalidated so that dependent objects can be recompiled and verified and all dependent function-based indexes must be marked unusable.

Therefore, in the previous example, as jward.emp is created, jward.dept_salaries is invalidated because it depends on jward.emp. Then when jward.dept_salaries is used, Oracle attempts to recompile the view. As Oracle resolves the reference to emp, it finds jward.emp (public.emp is no longer the referenced object). Because jward.emp does not have a sal column, Oracle finds errors when replacing the view, leaving it invalid.
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32189836
iNT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iNT
Гость
Сколько флейма вызвал невинный вопрос! Надо было наверное описать проблему целиком, а не задавать частный вопрос. Проблема такова: на сервере крутится десяток задач, (каждая в своей схеме) есть десять юзеров, каждый из которых имеет доступ к своей задаче. Нужно завести еще 50 юзеров, 5 из которых будут работать в первой задаче, 5 во второй, 5 в третьей и т.д. Т.е. в каждой задаче должно работать 6 пользователей (владелец схемы и 5 новозаведенных). Public синонимы не подходят сразу, в схемах есть объекты с одинаковыми именами. Private синонимов получается слишком много, делать долго... в общем не нравится такое решение. Особенно в контексте переодического добавления/убивания разных объектов. Хочется сделать просто и элегантно, например написав
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE TRIGGER TG_A_LOGON
 AFTER 
 LOGON
 ON DATABASE
DECLARE
   s   VARCHAR2 ( 1024 );
BEGIN
   IF login_user = 'USER1' 
   THEN 
      s := 'ALTER SESSION SET CURRENT_SCHEMA = USER2';
      EXECUTE IMMEDIATE s;
   END IF;
END;

ЭТО НЕ РАБОТАЕТ! alter session... выполняется, (проверял заменив alter session... на insert into...) но текущая схема остается прежней! А как было бы хорошо: добавляется объект -- разрешения на него в роль добавил и все. Завести пользователя -- присвоил роль, триггер изменил (если будет работать, соответствие юзера и схемы будет брать из таблички, так что один insert) сиди плюй в потолок. Ладно насоздаю я эти тысячи синонимов, не так уж долго, но как подобные проблемы решаются в БОЛЬШОМ И СЕРЬЕЗНОМ мире? Неужели для задач с 1000 пользователями и 500 объектами создаются полмиллиона синонимов? Или на сервере принципиально крутится ОДНА задача и можно обойтись создав 500 public? Или все юзеры под одним именем?
HELP!!!
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32189928
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to iNT

Дискуссии о CURRENT_SCHEMA в форуме уже встречались, советы которыя я сочла полезными следующие

1) Создавать единый account для приложения а потом раздавать привилегии включая или не включая определенные роли
2) Использовать синонимы

Странно что у тебя EXECUTE IMMEDIATE 'ALTER SESSION SET ... не работает. Возможно это из за триггера. Проверила на процедуре, схема меняется

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
SQL> connect vio2/ххх
Connected.

SQL> select * from test1;

         X
 ----------
 
         21 

SQL> declare
   2 
   3     l_x int;
   4     usr varchar( 30 );
   5 
   6   begin
   7 
   8     select x into l_x from test1;
   9     dbms_output.put_line(l_x);
  10 
  11     EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = VIO';
  12 
  13     select x into l_x from test1;
  14     dbms_output.put_line(l_x);
  15 
  16   end;
  17   /
 21   -- все нормально
 
declare  -- сменилась схема, в ней такой таблицы нет
 
*
ERROR at line  1 :
ORA- 00942 : table or view does not exist
ORA- 06512 : at line  13 
...
Рейтинг: 0 / 0
А можно в Oracle юзеру назначить схему по умолчанию?
    #32190000
drive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теоретически, у тебя есть два решения (и оба ты уже описал :) )
Написать скрипт который дает гранты на объекты владельца 5 новозавенным пользователям, и создает в 5-ти новозавенных схемах синонимы на эти объекты

Обеспечить 5-и новозавенным пользователям, вход и работу в схеме владельца.
В первом случае новозавенные пользователи работают в своих схемах, во втором, в схеме владельца. Для втрого случая новозавенные пользователи должны предоставить ПАРОЛЬ владельца!!!
Стандартные механизмы сокрытия пароля владельца в Oracle есть, насколько я знаю, в Oracle Application Server 9i и только для WEB-приложений (что-то типа Personalization, непомню точно). Насколько я понимаю тебе это не подходит - клиентское приложение уже есть и оно не под web... Тогда тебе придется сказать пароль владельца или хранить пароль где-нибудь в базе. И то и другое, наверное, недопустимо.

Итак используй 1-й вариант: создание синонимов в схемах новозавенных пользователей и дуступ к ним к объектам владельцев.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / А можно в Oracle юзеру назначить схему по умолчанию?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]