Showing all posts tagged #oracle:


兩顆沒碰過的地雷 Oracle Sequence, Lucene lock file

Posted on March 9th, 2015

  1. lucene 在操作時會在 temp 目錄產生一個 lucene*.lock
    若程式被異常終止後, 導致該檔案沒有沒刪除, 會讓 lucene 幾乎整個壞掉, 因為每次要 query 或建 index 時, 遇到 .lock 檔時, 操作皆會被 lucene 擋下來

暫時的解決方案

 - 透過每次啟動時, 去清除 temp 目錄底下所有的 `lucene*.lock` 檔,

  1. Oracle DB 某張 Table 不明原因導致當前 Sequence 小於已經存在資料的 Sequence, 讓新資料想要 insert 不能, 因為 Sequence 不能重複

暫時的解決方案

 - 透過 Oracle 查看該 Table 的 Sequence 到多少了,
documentviewlog_seq
.
currval
 from 
dual

並比對存在資料的 Sequence, 最後透過 nextval 來增加到比已經存在的資料多 1 個序號, 應該就會正常了

nextval 每次 insert 之後, sequence 就會直接 +1
若要用 currval 之前, 必須先用 nextval select 一次
documentviewlog_seq
.
nextval
 from 
dual

Oracle 資料庫密碼過期相關指令

Posted on February 26th, 2015

  1. 密碼過期時就得修改密碼 , 否則該帳號將無法使用:

    ALTER USER "使用者名稱" IDENTIFIED BY "新密碼" REPLACE "舊密碼"

  2. 查詢 Default user profile 的密碼期限: (預設是 180 天)
    SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';

  3. 查詢 user 是哪一種 profile: (預設應該都是 default)
    SELECT username,PROFILE FROM dba_users;

  4. 修改 default user profile 密碼過期的時間 (這邊改為無限制: UNLIMITED)
    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

注意:

  • 按照 第4點 的修改 user profile 會降低帳號的安全性, 因為原本預設是 180 天密碼到期, 期至便須修改密碼, 改無限制意思是永遠不會過期. (所以我只用在開發用的機器上, 產品或客戶的資料庫不要用)

參考資料:

  1. Oracle 11g密碼過期問題 ORA-28002

  2. Oracle 11g存在密碼過期問題


透過 SQL 查詢樹狀結構某節點下的所有節點

Posted on December 26th, 2014

透過 SQL 查詢 Oracle 樹狀結構某節點下的所有節點

  • ORACLE 限定方法: START WITH ... CONNECT BY PRIOR ...
  • Oracle ex:
SELECT Id
FROM Category START WITH Id=2 CONNECT BY
PRIOR Id=Parentid

透過 SQL 查詢 MSSQL 樹狀結構某節點下的所有節點

  • MSSQL 似乎沒有直接的查詢語法(?), 但有 with
  • MSSQL ex:
WITH n (id, name) AS
    (SELECT id, name
    FROM category
    WHERE id = 2 --父節點 id
    UNION ALL SELECT child.id, child.name
    FROM Category AS child, n
    WHERE n.id = child.parentId)

SELECT * FROM n

如果要透過 n 再查詢, 例如查詢分類樹底下所有 binder
(假設 BinderCategory 透過 Binder_Category 來記錄關聯性)

WITH n (id, name) AS (SELECT id, name FROM category WHERE id = 2 --父節點 id UNION ALL SELECT child.id, child.name FROM Category AS child, n WHERE n.id = child.parentId) SELECT * FROM Binder bb LEFT JOIN Binder_Category bc ON bc.binder_id = bb.id WHERE bc.cat_id IN (SELECT id FROM n)

(感謝 April 大大教學)


Liu@llen

Notes from my experience.