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>
当应用程序用户只是一个
主模式的替代入口点,不需要对象
自己的。