Oracle中的public
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 DB_LINK
-------------------- -------------------- -------------------- -------------------- --------------------
PUBLIC TEST N1 TEST
如果我們賦予了某個物件的許可權給PUBLIC,在許可權資料字典中會有相應的記錄。
SQL> select * from dba_tab_privs where grantee='PUBLIC' and rownum<10;
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTA HIERAR
-------------------- -------------------- ------------------------------ ---------- -------------------- ------ ------
PUBLIC SYS ORA$BASE SYS USE NO NO
PUBLIC SYS DUAL SYS SELECT YES NO
PUBLIC SYS SYSTEM_PRIVILEGE_MAP SYS SELECT YES NO
PUBLIC SYS TABLE_PRIVILEGE_MAP SYS SELECT YES NO
PUBLIC SYS STMT_AUDIT_OPTION_MAP SYS SELECT NO NO
PUBLIC SYS DM$EXPIMP_ID_SEQ SYS SELECT NO NO
PUBLIC SYS STANDARD SYS EXECUTE NO NO
PUBLIC SYS DBMS_STANDARD SYS EXECUTE NO NO
PUBLIC SYS ALL_XML_SCHEMAS SYS SELECT YES NO
9 rows selected.
如果感覺有些奇怪,我們可能記得在使用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確實是一個特殊的存在,可以簡單理解為所有資料庫使用者的集合。
首先我們建立一個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 DB_LINK
-------------------- -------------------- -------------------- -------------------- --------------------
PUBLIC TEST N1 TEST
如果我們賦予了某個物件的許可權給PUBLIC,在許可權資料字典中會有相應的記錄。
SQL> select * from dba_tab_privs where grantee='PUBLIC' and rownum<10;
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTA HIERAR
-------------------- -------------------- ------------------------------ ---------- -------------------- ------ ------
PUBLIC SYS ORA$BASE SYS USE NO NO
PUBLIC SYS DUAL SYS SELECT YES NO
PUBLIC SYS SYSTEM_PRIVILEGE_MAP SYS SELECT YES NO
PUBLIC SYS TABLE_PRIVILEGE_MAP SYS SELECT YES NO
PUBLIC SYS STMT_AUDIT_OPTION_MAP SYS SELECT NO NO
PUBLIC SYS DM$EXPIMP_ID_SEQ SYS SELECT NO NO
PUBLIC SYS STANDARD SYS EXECUTE NO NO
PUBLIC SYS DBMS_STANDARD SYS EXECUTE NO NO
PUBLIC SYS ALL_XML_SCHEMAS SYS SELECT YES NO
9 rows selected.
如果感覺有些奇怪,我們可能記得在使用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確實是一個特殊的存在,可以簡單理解為所有資料庫使用者的集合。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2124616/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle RAC中的Public IP, VIP和Internal IP,SCANOracle
- 【Oracle】-【同義詞】-public與非public同義詞Oracle
- PostgreSQL-PostgreSQL中的public(九)SQL
- java中的 public protected friendly privateJava
- Oracle RAC修改Scan IP,Public IP的方法Oracle
- Oracle RAC修改public, VIP, SCAN IPOracle
- java中public private protected default的區別Java
- Laravel 5中去掉URL中的public路徑方法Laravel
- Oracle RAC修改public,private,vip scan IPOracle
- oracle 11gR2 如何修改public ipOracle
- oracle 11g rac更改public的網路卡名稱Oracle
- Oracle RAC環境下vip/public/private IP的區別Oracle
- Oracle 12.2 RAC修改public ip address或public ip(subnet (netmask) or interface)Oracle
- Check the existence of public synonyms Remove the public synonymsREM
- C++中的三種繼承public,protected,private(轉)C++繼承
- RAC中的各種IP-PUBLIC-VIP-Private-SCAN IP
- thinkphp中無法解析__PUBLIC__ 模板常量PHP
- How to Change Interconnect/Public Interface IP or Subnet in Oracle ClusterwareOracle
- php class中public,private,protected,static的區別,以及例項PHP
- var和public的區別
- Public Private VIP的區別
- CRS : PUBLIC網路卡的STANDBY
- 蘋果系統中的的 Public 與 Developer Beta有什麼區別?蘋果Developer
- Oracle使用者訪問許可權與PUBLIC角色的關係Oracle訪問許可權
- 關於php中openssl_public_encrypt無填充的一個注PHP
- Oracle 12. 2 RAC public IP與vip 互換方法Oracle
- C#中public、private、protected、internal、protected internal (轉載)C#
- Swift 3.0 的 open,public,internal,fiSwift
- Public與Private的區別 (轉)
- public interface View介面和public interface ViewResolver介面介紹View
- oracle10g RAC更改主機public地址及vip地址Oracle
- 【Java小疑問】類和方法 前面新增public和不新增public的區別Java
- public void sendHtmlHTML
- public-image-mirror
- 攔截|篡改|偽造.NET類庫中不限於public的類和方法
- 修改 Laravel 的預設 public 路徑Laravel
- 私有屬性的Get Set 與 Public
- Azure Public IP DNS域名DNS