ORACLE技術(shù)問題專家問答五則
2024-08-29 13:37:53
供稿:網(wǎng)友
一問:有關(guān)口令
我在Solaris系統(tǒng)上運(yùn)行 Oracle8i 8.1.7企業(yè)版。我創(chuàng)建了兩個(gè)數(shù)據(jù)庫:SUGAR和TestDb。將兩者的remote_login_passWordfile都設(shè)置為 “獨(dú)占(exclusive)”。我試圖以SYSDBA身份連接到TestDb,但未能成功。下面是我的做法:
$sqlplus /nolog
SQL> conn sys/change_on_install@testdb
Connected.(已連接)
SQL> select * from v$pwfile_users;
username sysdb sysop
-----------------------------------------
internal true true
sys true true
SQL> conn sys/change_on_install@testdb as
sysdba
ERROR(錯(cuò)誤)
ORA-01017: invalid username/password; logon
denied(無效的用戶名/口令,登錄被拒絕)
Warning: You are on longer connected to
ORACLE(警告:你已經(jīng)與ORACLE斷開連接)
我為什么不能以SYSDBA身份連接到TestDb?
答:通常Oracle中的SYS口令與INTERNAL口令是同步的,SYS口令存儲于口令文件中。在上述情況下你建立了包含有一個(gè)口令的口令文件,而不是使用缺省的 “change_on_install,”這就是問題之所在。
希望下面的方法對你有所幫助。首先,建立一個(gè)口令文件,其中包含一個(gè)口令,這個(gè)口令不要與系統(tǒng)口令匹配:
$ orapwd file=orapw password=Foobar
entries=40
然后,進(jìn)入服務(wù)器,啟動(dòng)數(shù)據(jù)庫:
$ svrmgr
SVRMGR> connect internal
Connected.(已連接)
SVRMGR> startup
ORACLE instance started.(ORACLE 實(shí)例已啟動(dòng))
Total System Global Area (系統(tǒng)全局區(qū)域大小)
193073136 bytes
Fixed Size (固定大小)
69616 bytes
Variable Size (可變大小)
141639680 bytes
Database Buffers (數(shù)據(jù)庫緩沖區(qū))
45056000 bytes
Redo Buffers (重做緩沖區(qū))
6307840 bytes
Database mounted. (數(shù)據(jù)庫已加載)
Database opened.數(shù)據(jù)庫已打開。
現(xiàn)在使用SYS用戶的口令,以SYS身份連接:
SVRMGR> connect sys/change_on_install@ora81
Connected.(已連接)
成功了。現(xiàn)在試著以SYSDBA身份連接:
SVRMGR> connect sys/change_on_install@ora81
as sysdba;
ORA-01017: invalid username/password; logon
denied(無效的用戶名/口令;登錄被拒絕)
這里出現(xiàn)了你所說的錯(cuò)誤。你的SYS口令為:change_on_install,但口令文件中的口令卻是foobar。SYS用戶是專用的,以SYSDBA身份連接就像是以INTERNAL連接,你必須使用口令文件中的口令。試試這樣做:
SVRMGR— connect sys/foobar@ora81 as sysdba;
Connected.(已連接)
并不是每個(gè)人都需要使用口令文件中的口令;用戶需要使用他們自己的口令。通過授權(quán)SYSDBA給SCOTT,你就可以明白這一點(diǎn):
SVRMGR> grant sysdba to scott;
Statement PRocessed.(已處理)
這個(gè)命令將SCOTT以SCOTT的憑證加入到口令文件中。假如你改變了SCOTT的口令,口令文件也會(huì)自動(dòng)同步改變。現(xiàn)在,你可以試試以SYSDBA身份連接SCOTT了:
SVRMGR> connect scott/tiger@ora81 as sysdba;
Connected.(已連接)
一切正常。
現(xiàn)在可以使用ALTER USER 命令來改變SYS用戶的口令。
SVRMGR> alter user sys identified by
change_on_install;
Statement processed.(已成功更改)
SVRMGR≫ connect sys/change_on_install@ora81
as sysdba;
Connected.(已連接)
你還可以用change_on_install,因?yàn)楦淖僑YS用戶口令將同時(shí)改變口令文件中的口令。當(dāng)你建立了口令文件后,Oracle數(shù)據(jù)庫在其中放入兩個(gè)賬號:SYS和INTERNAL,并將你在命令行中提供的口令作為這兩個(gè)賬戶的口令。當(dāng)你改變數(shù)據(jù)庫中的SYS用戶口令時(shí),數(shù)據(jù)庫將沖掉口令文件中的SYS和INTERNAL口令。下面操作將顯示口令foobar已經(jīng)是無效的了:
SVRMGR> connect sys/foobar@ora81 as sysdba;
ORA-01017: invalid username/password; logon
denied(無效的用戶名/口令,登錄被拒絕)
二問:利用QUERY選項(xiàng)輸出數(shù)據(jù)
我知道在Oracle8i中,可以使用QUERY有選擇地輸出表數(shù)據(jù)。我想用EXP命令來實(shí)現(xiàn),但沒有成功。下面是我所寫的命令,以及得到的錯(cuò)誤信息:
exp ddd/ddd file=/dbf/u11/customer.dmp
tables=AASC.AST_CUSTOMER_KEEP
query=/'where CUA_TRANS_DTS /<
add_months/(sysdate, -6/)/'
table_export[2]: CUA_TRANS_DTS: not found.(沒有找到)
答:操作系統(tǒng)不同,用來指定QUERY=參數(shù)的方法也不同。WHERE 語句里面往往有很多非凡的字符,如=.>.<和空格等等。而UNIX和Windows操作系統(tǒng)中的外殼命令提示是不歡迎這些字符的,這些字符將被忽略。你應(yīng)該根據(jù)不同的操作系統(tǒng)采用不用的方法。我一般使用帶有QUERY選項(xiàng)的參數(shù)文件(PARFILE),利用PARFILE,可以不考慮操作系統(tǒng)平臺而使用完全相同的方法。
下面給出一個(gè)例子。我用select * from all_objects建立了一個(gè)表T,我希望輸出所有object_id 小于5000的行。在Windows中,必須這樣做:
C:/exp>exp userid=tkyte/tkyte tables=t
query="""where object_id < 5000"""
注重:在windows中,需要在WHERE語句的兩端使用三個(gè)雙引號。在UNIX中,必須這樣做:
$ exp userid=/ tables=t query=/"where
object_id /< 5000/"
exp userid=/ tables=t parfile=exp.par
假如使用包含query="where object_id < 5000"的PARFILE文件,我可以在兩個(gè)系統(tǒng)中使用相同的一個(gè)命令:
exp userid=/ tables=t parfile=exp.par
在兩種操作系統(tǒng)中,完全相同。這相對于在不同的平臺中使用不同的QUERY字符串輕易多了。
三問:DBMS_RANDOM
您能否告訴我寫一個(gè)能產(chǎn)生大于0小于1的隨機(jī)數(shù)的隨機(jī)數(shù)產(chǎn)生器的最好方法?
答:Oracle8 8.0版介紹了DBMS_RANDOM包,Oracle8i 8.1.6版介紹了DBMS_RANDOM包的新功能,但Oracle8i 文檔中沒有具體全面介紹其功能。幸運(yùn)的是:有一個(gè)新的DBMS_RANDOM包函數(shù)能夠返回0-1之間的隨機(jī)數(shù)。這個(gè)新函數(shù)是:
FUNCTION value RETURN NUMBER;
FUNCTION value (low IN NUMBER, high IN
NUMBER) RETURN NUMBER;
FUNCTION normal RETURN NUMBER;
FUNCTION string (opt char, len NUMBER)
RETURN VARCHAR2;
VALUE函數(shù)的第一種形式返回一個(gè)大于或等于0且小于1的隨機(jī)數(shù);第二種形式返回一個(gè)大于或等于LOW,小于HIGH的隨機(jī)數(shù)。下面是其用法的一個(gè)示例:
SQL> select dbms_random.value,
dbms_random.value(55,100)
2 from dual;
VALUE DBMS_RANDOM.VALUE(55,100)
--------------- -----------------------------
.782821936 79.6367038
NORMAL函數(shù)返回服從正態(tài)分布的一組數(shù)。此正態(tài)分布標(biāo)準(zhǔn)偏差為1,期望值為0。這個(gè)函數(shù)返回的數(shù)值中有68%是介于-1與+1之間,95%介于-2與+2之間,99%介于-3與+3之間。事實(shí)上,這就是你在清單1中所看到的。
最后,是STRING函數(shù)。它返回一個(gè)長度達(dá)60個(gè)字符的隨機(jī)字符串。參數(shù)OPT可以是清單2顯示的值中的任何一個(gè)單個(gè)字符。
關(guān)于這些函數(shù)及DBMS_RANDOM包的文件都包含在SQLPlus中:
select text
from all_source
where name = 'DBMS_RANDOM'
and type = 'PACKAGE' order by line;
四問:連接次序與謂詞求值
在下面的查詢中,WHERE 語句的哪一部分先執(zhí)行?
Select field names from emp, dept
where emp.dept_num = dept.num and
emp.name Like 'S%' and dept.name='IT';
答:執(zhí)行次序隨已有的索引、統(tǒng)計(jì)、和session/init.ora參數(shù)的不同而變化。
假定已有一個(gè)建立在DEPT(name)和EMP(dept_num)上的索引。假定優(yōu)化器認(rèn)為DEPT是唯一的,它可能按下面的順序進(jìn)行操作:
利用建立在DEPT(name)上的索引查找dept列
利用建立在EMP(dept_num)上的索引查找匹配的emp列(即連接emp.dept_num = dept.num)
依據(jù)建立在emp.ename like 'S%'進(jìn)行過濾
現(xiàn)在,我們假定沒有建立在EMP(dept_num)上的索引,也沒有建立在DEPT(name)上的索引,而存在建立在EMP(name)和DEPT(num)上的索引。優(yōu)化器可能按下面的次序進(jìn)行操作:
利用建立在EMP(name)上的索引找到帶有S的EMPS
利用建立在DEPT(num)上的索引找到匹配項(xiàng)
根據(jù)dept.name = 'IT'過濾結(jié)果
謂詞求值的次序是不確定的,可以隨時(shí)間的改變而改變,并由優(yōu)化器決定。不要假定任何事情會(huì)按一定的次序發(fā)生。假如你那么做,隨著時(shí)間的推移,你的應(yīng)用程序可能會(huì)出現(xiàn)一些看