CURRENT_SCHEMA方法
此方法使用CURRENT_SCHEMA会话属性自动将应用程序用户指向正确的模式。
首先,我们创build架构所有者和应用程序用户。
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;
请注意,应用程序用户可以连接,但没有任何表空间配额或权限来创build对象。
接下来,我们创build一些angular色来允许读写和只读访问。
CREATE ROLE schema_rw_role; CREATE ROLE schema_ro_role;
我们希望给我们的应用程序用户读写模式对象的权限,所以我们授予相关angular色。
GRANT schema_rw_role TO app_user;
我们需要确保应用程序用户的默认模式指向架构所有者,所以我们创build一个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; /
现在我们准备在架构所有者中创build一个对象。
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;
注意如何授予相关angular色的权限。 没有这个,对象就不会被应用程序用户看到。 我们现在有一个正常运行的架构所有者和应用程序
SQL> CONN app_user/password Connected. SQL> DESC test_tab Name Null? Type ----------------------------------------------------- -------- ------------------------------------ ID NOT NULL NUMBER DESCRIPTION VARCHAR2(50) SQL>
在应用程序用户只是主模式的替代入口点时,此方法非常理想,不需要自己的对象。