忽視細節導致簡單問題的複雜化 關於PUPBLD.SQL
簡單問題的出現:
使用SCOTT使用者登陸時出現問題:
SQL> conn scott/tiger
訪問 PRODUCT_USER_PROFILE 時出錯
警告: 未載入產品使用者概要檔案資訊!
您需要將 PUPBLD.SQL 作為 SYSTEM 執行
已連線。
想法很簡單,因為是剛手工建立的庫,使用system跑一遍PUPBLD.SQL指令碼就好。
SQL> conn system/oracle as sysdba
已連線。
SQL> @D:\oraclexe\app\oracle\product\10.2.0\server\sqlplus\admin\pupbld.sql
跑指令碼成功後,再次使用SCOTT使用者登陸:
SQL> conn scott/tiger
訪問 PRODUCT_USER_PROFILE 時出錯
警告: 未載入產品使用者概要檔案資訊!
您需要將 PUPBLD.SQL 作為 SYSTEM 執行
已連線。
問題依舊,開始疑惑,直接檢視pupbld.sql指令碼:
*省略註釋*
DROP SYNONYM PRODUCT_USER_PROFILE;
CREATE TABLE SQLPLUS_PRODUCT_PROFILE AS
SELECT PRODUCT, USERID, ATTRIBUTE, SCOPE, NUMERIC_VALUE, CHAR_VALUE,
DATE_VALUE FROM PRODUCT_USER_PROFILE;
ALTER TABLE SQLPLUS_PRODUCT_PROFILE ADD (LONG_VALUE LONG);
-- Create SQLPLUS_PRODUCT_PROFILE from scratch
CREATE TABLE SQLPLUS_PRODUCT_PROFILE
(
PRODUCT VARCHAR2 (30) NOT NULL,
USERID VARCHAR2 (30),
ATTRIBUTE VARCHAR2 (240),
SCOPE VARCHAR2 (240),
NUMERIC_VALUE DECIMAL (15,2),
CHAR_VALUE VARCHAR2 (240),
DATE_VALUE DATE,
LONG_VALUE LONG
);
-- Remove SQL*Plus V3 name for sqlplus_product_profile
DROP TABLE PRODUCT_PROFILE;
-- Create the view PRODUCT_PRIVS and grant access to that
DROP VIEW PRODUCT_PRIVS;
CREATE VIEW PRODUCT_PRIVS AS
SELECT PRODUCT, USERID, ATTRIBUTE, SCOPE,
NUMERIC_VALUE, CHAR_VALUE, DATE_VALUE, LONG_VALUE
FROM SQLPLUS_PRODUCT_PROFILE
WHERE USERID = 'PUBLIC' OR USER LIKE USERID;
GRANT SELECT ON PRODUCT_PRIVS TO PUBLIC;
DROP PUBLIC SYNONYM PRODUCT_PROFILE;
CREATE PUBLIC SYNONYM PRODUCT_PROFILE FOR SYSTEM.PRODUCT_PRIVS;
DROP SYNONYM PRODUCT_USER_PROFILE;
CREATE SYNONYM PRODUCT_USER_PROFILE FOR SYSTEM.SQLPLUS_PRODUCT_PROFILE;
DROP PUBLIC SYNONYM PRODUCT_USER_PROFILE;
CREATE PUBLIC SYNONYM PRODUCT_USER_PROFILE FOR SYSTEM.PRODUCT_PRIVS;
-- End of pupbld.sql
手動執行sql語句,建立表和檢視及同義詞:
SQL> DROP SYNONYM PRODUCT_USER_PROFILE;
SQL> DROP TABLE PRODUCT_USER_PROFILE;
SQL> CREATE TABLE SQLPLUS_PRODUCT_PROFILE(PRODUCT VARCHAR2 (30) NOT NULL,USERID VARCHAR2 (30),ATTRIBUTE VARCHAR2 (240),SCOPE VARCHAR2 (240),NUMERIC_VALUE DECIMAL (15,2),CHAR_VALUE VARCHAR2 (240),DATE_VALUE DATE,LONG_VALUE LONG);
表已建立。
SQL> DROP VIEW PRODUCT_PRIVS;
檢視已刪除。
SQL> CREATE VIEW PRODUCT_PRIVS AS
2 SELECT PRODUCT, USERID, ATTRIBUTE, SCOPE,
3 NUMERIC_VALUE, CHAR_VALUE, DATE_VALUE, LONG_VALUE
4 FROM SQLPLUS_PRODUCT_PROFILE WHERE USERID = 'PUBLIC' OR USER LIKE USERID;
檢視已建立。
SQL> GRANT SELECT ON PRODUCT_PRIVS TO PUBLIC;
授權成功。
SQL> DROP PUBLIC SYNONYM PRODUCT_PROFILE;
同義詞已刪除。
SQL> CREATE PUBLIC SYNONYM PRODUCT_PROFILE FOR SYSTEM.PRODUCT_PRIVS;
同義詞已建立。
成功。
使用SCOTT使用者登陸,問題依舊,檢查建立的表:
SQL> select * from product_user_profile;
select * from product_user_profile
*
第 1 行出現錯誤:
ORA-00980: 同義詞轉換不再有效
SQL> select * from system.product_privs;
select * from system.product_privs
*
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在
仔細檢查執行過的SQL語句,發現疑點:conn system/oracle as sysdba system.product_privs;
SQL> show user
USER 為 "SYS"
問題找到,再次確定一下:
SQL> select * from sys.product_privs;
未選定行
確定問題,是細節失誤,在Oracle裡,system如果正常登入,它其實就是一個普通的dba使用者,但是如果以as sysdba登入,其結果實際上它是作為sys使用者登入的,這一點類似Linux裡面的sudo的感覺,從登入資訊裡面可以看出來。因此在as sysdba連線資料庫後,建立的物件實際上都是生成在sys中的。其他使用者也是一樣,如果 as sysdba登入,也是作為sys使用者登入的。
登入到system使用者:
SQL> conn system/oracle
已連線。
檢查使用者:
SQL> show user
USER 為 "SYSTEM"
這次沒有問題了,執行pupbld.sql指令碼成功後,再次使用SCOTT使用者登陸:
SQL> conn scott/tiger
已連線。
OK,問題解決!
總結:這次問題其實很簡單,只要登入system跑一下指令碼就可以了,但是卻因為習慣和不當回事的態度,在登入system使用者時順手加上了as sysdba,導致後面問題的出現,由此可見,在Oracle中,細節是非常非常重要的,來不得半點馬虎,另外一點,出現問題,要有條理的從頭來分析,不要過於發散思維,要有邏輯性,這樣會為解決問題節省很多時間的。
補充(以下內容部分轉載自網路):
關於PUPBLD.SQL
我們可以分析一下PUPBLD.SQL中程式碼,知道它實際上是建立了一個表SQLPLUS_PRODUCT_PROFILE,基於此表建立檢視PRODUCT_PRIVS(包含表中所用欄位),把檢視PRODUCT_PRIVS的SELECT許可權設定為PUBLIC,建立了檢視PRODUCT_PRIVS的同義詞PRODUCT_PROFILE,建立了表SQLPLUS_PRODUCT_PROFILE的同義詞PRODUCT_USER_PROFILE,後用建立了檢視PRODUCT_PRIVS的PUBLIC同義詞PRODUCT_USER_PROFILE 。
SQLPLUS_PRODUCT_PROFILE(基表)->PRODUCT_USER_PROFILE(同義詞)
PRODUCT_PRIVS(檢視,授權SELECT給PUBLIC)->PRODUCT_PROFILE(同義詞)
PRODUCT_USER_PROFILE(同義詞,PUBLIC)
因為自己對這表、檢視和同義詞和PUBLIC,不是很瞭解。所以,先通過以下實驗來檢驗一下:
首先用普通使用者登入
SQL> conn scott/tiger
Connected.
普通使用者無法訪問SQLPLUS_PRODUCT_PROFILE
SQL> select * from system.SQLPLUS_PRODUCT_PROFILE;
select * from system.SQLPLUS_PRODUCT_PROFILE
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from SQLPLUS_PRODUCT_PROFILE;
select * from SQLPLUS_PRODUCT_PROFILE
*
ERROR at line 1:
ORA-00942: table or view does not exist
普通使用者可以在加模式字首的前提下訪問PRODUCT_PRIVS
SQL> select * from system.PRODUCT_PRIVS;
no rows selected
SQL> select * from PRODUCT_PRIVS;
select * from PRODUCT_PRIVS
*
ERROR at line 1:
ORA-00942: table or view does not exist
普通使用者可以直接訪問PRODUCT_PROFILE
SQL> select * from system.PRODUCT_PROFILE;
select * from system.PRODUCT_PROFILE
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from PRODUCT_PROFILE;
no rows selected
普通使用者可以直接訪問PRODUCT_USER_PROFILE
SQL> select * from PRODUCT_USER_PROFILE;
no rows selected
SQL> select * from system.PRODUCT_USER_PROFILE;
select * from system.PRODUCT_USER_PROFILE
*
ERROR at line 1:
ORA-00942: table or view does not exist
基本可以得出以下結論:
1、訪問同義詞可以不用使用模式字首(理解為同義詞可以方便我們訪問)。
2、只有被授權為PUBLIC的,才可以由其他使用者訪問。來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14184018/viewspace-691502/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡單問題複雜著解決
- 容易忽視的細節:Log4j 配置導致的零點介面嚴重超時
- 關於 Laravel mix 導致 Bootstrap 失效的問題Laravelboot
- 關於CSS一些細節問題CSS
- 細節決定成敗,不容忽視的10道Node面試題面試題
- 那些容易被忽視的 JavaScript 細節總結JavaScript
- 細節決定成敗!APP設計不容忽視的20個細節APP
- 關於log4j.jar導致的中文問題JAR
- 關於兩個簡單問題的分析
- 不要忽視Web程式設計中的小細節Web程式設計
- 網頁設計中那些不容忽視的細節網頁
- 解謎遊戲不可忽視的細節——《COCOON》的隱性引導設計遊戲
- 一條簡單的sql語句導致的系統問題SQL
- 一個簡單的MySQL引數導致的連線問題解惑MySql
- Laravel 關聯模型由於名稱一致性導致的問題Laravel模型
- dba工作一定要細心:由於不細心導致的一個小問題
- 關於資料庫 Block 儲存細節問題的討論資料庫BloC
- 關於 iconv 轉碼導致資料丟失的問題
- 關於JAVAMAIL導致JSP伺服器停止的問題!急JavaAIJS伺服器
- 問一個關於oracle8的簡單的問題!Oracle
- 應對複雜故障問題的簡單故障處理庫包:FailsafeAI
- Python 元組列表排序:初學者可能忽視的細節Python排序
- 被忽視的開發安全問題
- QOJ6958-複雜的雙樹上問題以及簡單的解決方式
- [分享]關於新版本 Composer 會導致 Class not found 的問題
- 群裡一人提的關於資料複雜統計的問題
- 從應用開發到營收 10個不能忽視的細節營收
- oracle兩節點RAC,由於gipc導致某節點crs無法啟動問題分析Oracle
- MySQL 你可能忽視的選擇問題MySql
- 關於SDWebImage載入高清圖片導致app崩潰的問題WebAPP
- 關於遊戲節奏的雜談(上)遊戲
- dolphinscheduler簡單任務定義及複雜的跨節點傳參
- 關於SQL的重複記錄問題SQL
- 關於沒有熔斷降級導致服務重啟問題
- iOS 面試大全從簡單到複雜(簡單篇)iOS面試
- 資料複雜性和簡單
- MySQL Sending data導致查詢很慢的問題詳細分析MySql
- 簡單程式的時間複雜度分析時間複雜度