1. 程式人生 > 其它 >Oracle中的PUBLIC(r10筆記第14天)

Oracle中的PUBLIC(r10筆記第14天)

Oracle中的PUBLIC是一種特殊的存在,總是感覺概念比較模糊,我們就簡單通過幾個測試來理解吧。 首先我們建立一個public的synonym,我們看看這個public的含義。 SQL> create public synonym test for n1.test; Synonym created. 檢視資料字典,可以看到owner是PUBLIC SQL> select object_name,owner,object_type from dba_objects where object_name='TEST' ; OBJECT_NAME OWNER OBJECT_TYPE -------------------- -------------------- -------------------------------------- TEST PUBLIC SYNONYM TEST N1 TABLE

public是一個使用者嗎? SQL> select *from dba_users where username='PUBLIC'; no rows selected 那public是一個角色嗎? SQL> select *from dba_roles where role='PUBLIC'; no rows selected 大體而言,public兩種表現形式 一種是建立public的物件,都是在PUBLIC的這個owner下 create public synonym xxxx for xxx; 或者我們把某個物件的許可權賦予PUBLIC grant select on xxx to public; 如果我們建立了某個public的物件,那麼在物件資料字典裡就會有相應的記錄。 SQL> select * from dba_synonyms where synonym_name='TEST'; OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME -------------------- -------------------- -------------------- -------------------- ------------- PUBLIC TEST N1 TEST
如果我們賦予了某個物件的許可權給PUBLIC,在許可權資料字典中會有相應的記錄。 SQL> select * from dba_tab_privs where grantee='PUBLIC' and rownum<10;

如果感覺有些奇怪,我們可能記得在使用sysoper的時候,shou user顯示的是PUBLIC [oracle@newtest ~]$ sqlplus sys/oracle as sysoper SQL> show user USER is "PUBLIC" 而如果我們嘗試把它當做使用者,修改密碼,那是行不通的。 SQL> alter user public identified by oracle; alter user public identified by oracle * ERROR at line 1: ORA-01935: missing user or role name 當然此處需要多補充一些,就是檢視資料庫軟體安裝的時候選擇的使用者組資訊,是通過下面的這個檔案可以看到的,在$ORACLE_HOME/rdbms/lib/config.c裡面。 [oracle@newtest lib]$ less config.c /* SS_DBA_GRP defines the UNIX group ID for sqldba adminstrative access. */ /* Refer to the Installation and User's Guide for further information. */ /* IMPORTANT: this file needs to be in sync with rdbms/src/server/osds/config.c, specifically regarding the number of elements in the ss_dba_grp array. */ #define SS_DBA_GRP "dba"

#define SS_OPER_GRP "" #define SS_ASM_GRP "" char *ss_dba_grp[] = {SS_DBA_GRP, SS_OPER_GRP, SS_ASM_GRP}; [oracle@newtest lib]$ id oracle uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba) 而順帶衍生一下,使用sysoper和sysdba出了官網的描述外,還有一些差別。 首先在上面的使用者配置資訊的條件下,使用作業系統認證的方式,sysoper來登入是會報錯的。 [oracle@newtest ~]$ sqlplus / as sysoper SQL*Plus: Release 11.2.0.4.0 Production on Tue Sep 6 19:42:58 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied 使用TNS連線的方式就大大不同。 [oracle@newtest ~]$ sqlplus sys/oracle@newtest2 as sysoper SQL> 而與此相比,有些不大靠譜的是使用sysdba的時候,隨便給個使用者密碼,都可以直接連線到資料庫例項,這個時候還沒有應用到密碼檔案校驗。 [oracle@newtest ~]$ sqlplus sys/oraclsadfasdfa as sysdba SQL> 這一點還是需要注意到的,當然使用TNS的方式都會開始校驗。 [oracle@newtest ~]$ sqlplus sys/oraclsdfasdfe@newtest2 as sysdba ERROR: ORA-01017: invalid username/password; logon denied 通過上面的小測試,可以看出PUBLIC確實是一個特殊的存在,可以簡單理解為所有資料庫使用者的集合。