Схема, идентификатор пользователя и функционала в Oracle - PullRequest
4 голосов
/ 04 августа 2011

Я перепутал много в оракуле о схеме, пользователе и функциональном идентификаторе.Давайте рассмотрим мои два разных случая

Случай I:

Давайте рассмотрим SCOTT@ORCL. Если мы думаем, что SCOTT - пользователь.при создании одного пользователя он создаст схему.Поправь меня, если я ошибаюсь.В этом случае, когда мы создавали SCOTT, была создана только одна пользовательская схема SCOTT.Предположим, если мы создадим другую схему, скажем X.Возможно ли, чтобы пользователь SCOTT владел X-схемой?

Случай II:

Давайте рассмотрим SCOTT@ORCL. Если мы думаем, что SCOTT является только схемой, т.е. которая создается только одной командой схемы.Если это так, то какая польза от схемы без какого-либо пользователя, которому она будет принадлежать?

Я слышал, что идентификатор функции оракула - это тот, который соединит несколько пользователей / схему (не знаюЯ могу поместить схему / пользователя здесь) в базе данных.есть ли разница в ч / б функциональном идентификаторе оракула с пользователем / схемой?

Ответы [ 2 ]

9 голосов
/ 04 августа 2011

Многие люди находят эту тему запутанной, потому что мы склонны к взаимозаменяемости вокруг USER и SCHEMA, когда они фактически являются отдельными, если связаны между собой объектами.

Схема - это коллекция объектов базы данных, принадлежащих пользователю.Когда мы создаем пользователя, мы создаем его схему одновременно.Изначально их схема пуста.

Легко показать, что USER и SCHEMA различны, потому что мы меняем текущую схему в сеансе.Это просто означает, что мы можем ссылаться на объекты в схеме другого пользователя без добавления префикса к имени владельца.

SQL> desc t1
 Name                                      Null?    Type
 ----------------------------------------- -------- -------------
 ID                                                 NUMBER

SQL> alter session set current_schema=APC
  2  /

Session altered.

SQL> desc t1
ERROR:
ORA-04043: object t1 does not exist

SQL> sho user
USER is "X"
SQL>

В этом случае у APC либо нет таблицы с именем T1, либо он не предоставил ее X. Единственный способ, которым X может видеть свою собственную таблицу, - это префикс ее собственным именем.или переключите текущую схему обратно на себя.


Чтобы ответить на ваш первый вопрос, схема всегда имеет то же имя, что и пользователь.Таким образом, SCOTT не может владеть схемой X;схема X принадлежит пользователю X.

Чтобы ответить на ваш второй вопрос, невозможно создать схему без пользователя.

Да, есть команда CREATE SCHEMA, но для этого требуется предварительное создание пользователя.На самом деле это не создание схемы, а создание нескольких объектов базы данных.По сути, это скорее команда ADD OBJECTS TO SCHEMA.

SQL> conn sys as sysdba
Enter password:
Connected.

SQL> create user x identified by x
  2  default tablespace users quota 10m on users
  3  /

User created.

SQL> grant create session, create table to x
  2  /

Grant succeeded.

SQL> conn x/x
Connected.

SQL> create schema authorization x
  2      create table t1 (id number)
  3      create table t2 (id number)
  4  /

Schema created.

SQL> select table_name from user_tables
  2  /

TABLE_NAME
------------------------------
T1
T2

SQL>

Команда CREATE SCHEMA довольно ограничена: мы можем создавать таблицы, представления и индексы и предоставлять привилегии объектам.Преимущество этого состоит в том, что мы можем просто создать несколько объектов в одной транзакции, так что все создания откатываются в случае сбоя.Это невозможно, когда мы запускаем каждый оператор create отдельно.


Не уверен, что вы думаете, когда упоминаете «идентификатор функции».Это не стандартная часть функциональности Oracle.

1 голос
/ 01 августа 2012

Это не определяет разницу между владельцем и схемой.

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

Этот парень показывает, как это сделать (иметь N пользователей) ... перенаправить на одну схему.

Я вставлюего код также, по случайному совпадению, URL-ссылка исчезнет в будущем.

http://www.oracle -base.com / article / misc / schema-owners-and-application-users.php

У него есть второй подход "синонима". Но я только вставляю версию CURRENT_SCHEMA. ОПЯТЬ, Я не беру на себя ответственность за это. Я просто ненавижу, когда кто-то говорит "Ваш ответ по этой ссылке"и BOOM, ссылка не работает.: <</p>

......................................................

(из http://www.oracle -base.com / статьи / разное / владельцы схем и приложения-users.php )

CURRENT_SCHEMA подход

Этот метод использует CURRENT_SCHEMAАтрибут сеанса для автоматического указания пользователям приложения на правильную схему.

Сначала мы создаем владельца схемы и пользователя приложения.

CONN sys/password AS SYSDBA

-- Remove existing users and roles with the same names.
DROP USER schema_owner CASCADE;
DROP USER app_user CASCADE;
DROP ROLE schema_rw_role;
DROP ROLE schema_ro_role;

-- Schema owner.
CREATE USER schema_owner IDENTIFIED BY password
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON users;

GRANT CONNECT, CREATE TABLE TO schema_owner;

-- Application user.
CREATE USER app_user IDENTIFIED BY password
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp;

GRANT CONNECT TO app_user;

Обратите внимание, что пользователь приложения может подключиться, но не можетиметь какие-либо квоты или привилегии табличного пространства для создания объектов.

Далее мы создадим некоторые роли, разрешающие доступ на чтение и запись и доступ только для чтения.

CREATE ROLE schema_rw_role;
CREATE ROLE schema_ro_role;

Мы хотим, чтобы пользователь нашего приложения читал-записать доступ к объектам схемы, поэтому мы предоставляем соответствующую роль.

GRANT schema_rw_role TO app_user;

Нам нужно убедиться, что у пользователя приложения есть схема по умолчанию, указывающая на владельца схемы, поэтому мы создаем триггер AFTER LOGON длясделайте это для нас.

CREATE OR REPLACE TRIGGER app_user.after_logon_trg
AFTER LOGON ON app_user.SCHEMA
BEGIN
  DBMS_APPLICATION_INFO.set_module(USER, 'Initialized');
  EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=SCHEMA_OWNER';
END;
/

Теперь мы готовы создать объект в владельце схемы.

CONN schema_owner/password

CREATE TABLE test_tab (
  id          NUMBER,
  description VARCHAR2(50),
  CONSTRAINT test_tab_pk PRIMARY KEY (id)
);

GRANT SELECT ON test_tab TO schema_ro_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON test_tab TO schema_rw_role;

Обратите внимание, как привилегии предоставляются соответствующим ролям.Без этого объекты не были бы видны пользователю приложения.Теперь у нас есть работающий владелец схемы и пользователь приложения.

SQL> CONN app_user/password
Connected.
SQL> DESC test_tab
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 ID                                                    NOT NULL NUMBER
 DESCRIPTION                                                    VARCHAR2(50)

SQL>

Этот метод идеален, когда пользователь приложения является просто альтернативной точкой входа в основную схему, не требующей собственных объектов.

...