2014-10-22 23 views
4

我們的應用程序適用於Oracle 10g數據庫,我們計劃現在將其遷移到exadata。 爲此,我們必須遵循exadata可接受的一些合規性。 其中一個是添加語句每一個現有的包/過程/函數的定義開始alter session NLS_LENGTH_SEMANTICS =程序包/存儲過程中的CHAR

alter session set NLS_LENGTH_SEMANTICS='CHAR' 

我只是想檢查,可以改變會話改變這個會話變量影響代碼的功能? 在向所有對象添加此語句時,我們必須記住哪些事情?

任何線索將高度讚賞

回答

4

修訂:

我修改,因爲從另一個尊重甲骨文員工專家(Sergiusz Wolicki),而事實上建議的文件進行了修訂,在這個參數上我的回答要警惕其設置爲CHAR作爲初始化參數,而事實上,該警告仍然有12.1

http://docs.oracle.com/database/121/NLSPG/ch3globenv.htm#NLSPG234

小心:Oracle強烈建議您不要在實例或服務器 參數文件中將 NLS_LENGTH_SEMANTICS參數設置爲CHAR。這可能會導致許多現有安裝腳本意外地創建具有字符長度語義的列,導致 運行時錯誤(包括緩衝區溢出)。

警告: IF的DDL腳本沒有明確的語義寫的,然後設置參數不會影響它,但是,它顯然不是那種被安全全線更新的Oracle產品腳本中。通過寫得很好的代碼,它肯定不會影響「代碼功能」,它是一個簡單地影響新字段寬度的設置。這裏的癥結似乎是你可以保證這是多麼舒服。

但是,如果Oracle警告它,他們有這樣做的經驗和證據。遺留的應用程序或工具不知道長度語義可能會受到影響。

Oracle的默認值是傳統​​因爲向後兼容性,但對於沒有遺留的東西一個新的數據庫,還有就是改變它沒有風險,它不影響內部數據字典,因爲這些被鎖定無論NLS_LENGTH_SEMANTICS的數據庫設置如何,都可以使用​​語義。

+0

我以前想過改變這個設置,但是被[本頁]上的警告嚇到了(http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams152.htm#REFRN10124 )。我不確定這是一個真正的警告還是20年未更新的內容。 – 2014-10-22 19:31:35

+0

這是我最近提到的。 https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:29518831139714 - 我最近將一個數據庫永久更改爲CHAR語義,11.2,以測試場景我的數據庫產品,並沒有不良影響。這就是說,我認爲這值得進一步考慮。通常如果有問題,Tom Kyte會提出來。在那個線程中,他沒有。 – codenheim 2014-10-22 20:07:36

+0

看到我不是唯一被湯姆誤導的人。 https://community.oracle.com/thread/2194933 - 讀完之後,並注意到11.2版文檔中的警告是在稍後修補的(在我多年前閱讀之後),我扭轉了立場。我對Oracle的看法是,他們對兼容性和安全性非常小心,所以我相信文檔和Tom Kyte都是如此。但是閱讀Sergiusz Wolicki(甲骨文)現在在文檔中的警告,這是一個錯誤。 – codenheim 2014-10-22 20:12:29

1

請注意,原來的問題是關於改變NLS_LENGTH_SEMANTICS的會話值。這種情況不在文檔中的警告中。如果你想使用舊腳本在會話中創建帶有字符長度語義的對象,那麼這個ALTER SESSION就很好。

doc警告特別針對在init.ora中設置參數,因爲此設置將影響所有不明確設置參數的會話(通過ALTER SESSION或環境變量)。如果你不小心,你可以運行各種遺留腳本,包括甲骨文,第三方或自己創建的腳本,並創建錯誤語義的對象,而不是擁有應用程序所期望的。字符語義而不是字節語義不會導致許多應用程序出現問題,並且不會被檢測爲問題,但可能會導致問題,包括某些情況下的安全問題。因此,Oracle建議您在腳本中明確設置長度語義,而不是依賴破壞舊東西兼容性的數據庫範圍設置。

如果你堅持要在init.ora中設置NLS_LENGTH_SEMANTICS,你必須記住重置它或者覆蓋所有期望BYTE語義的腳本。這可能很麻煩。