2012-06-11 22 views
3

我有一個很多行的表。
爲了測試目的,我的同事也使用同一張表。問題是,他有一段時間刪除了我正在測試的行和一些時間I.
那麼在oracle中有什麼方法可以讓某些特定的行只能讀取,所以其他的不應該刪除和編輯它?使表中的行只讀在oracle上?

謝謝。

+3

對於每個測試者的不同模式將是更好的解決方案 – kevinsky

回答

3

您可以創建一個防止刪除某些特定行的觸發器。

CREATE OR REPLACE TRIGGER trg_dont_delete 
    BEFORE DELETE 
    ON <your_table_name> 
    FOR EACH ROW 
BEGIN 
    IF :OLD.ID in (<IDs of rows you dont want to be deleted>) THEN 
     raise_application_error (-20001, 'Do not delete my records!!!'); 
    END IF; 
END; 

當然,你可以把它更聰明 - 使if聲明依靠user,或獲取記錄的ID從另一個表等

+1

+1好的親愛的。 – Addicted

-1

Oracle支持行級鎖。您可以阻止其他人刪除您正在使用的那一行。爲更好地檢查this link

+2

這隻能防止另一個人在事務中使用它時使用更改記錄。我認爲OP在抱怨其他用戶在OP不使用它時從表中刪除記錄。 – APC

4

有許多不同的方法來解決這個問題。

由於Sun Tzu said,如果您和您的同事使用不會發生碰撞的數據集,那麼最好的辦法是。

例如,也許你可以在本地PC上各自擁有自己的數據庫實例;這是否適合取決於許多因素,其中最重要的是與Oracle的許可安排。或者,您可以在共享數據庫中有單獨的模式;取決於你的應用程序,你可能需要給你同義詞或特殊連接。

另一種方法:每個人都建立自己的數據集,稱爲測試夾具。這是一個很好的策略,因爲測試只有在違背已知狀態時才真正有效;如果我們對數據的存在或缺失做出假設,我們的測試結果的有效性如何?重點是,測試應該自行清理,刪除在燈具中創建的數據和運行測試。採用這種策略,您需要同意每個團隊成員的ID範圍:他們只能使用其範圍內的記錄進行測試或開發工作。

我喜歡這些各種各樣的做法,因爲他們沒有真正改變應用程序的工作方式(可以說,除了使用不同的模式和同義詞)。更嚴厲的方法可用。

如果你有企業版,您可以使用行級安全性來保護您的記錄。這是最後一點的延伸:您需要一種機制來識別您的記錄,以及一些基礎架構來識別會話中的所有權。但除了防止其他用戶ROM刪除你的數據,你也可以防止它們插入,更新或者甚至觀看這與你的ID的範圍內記錄。 Find out more

更輕的解決方案是use a trigger as A B Cade suggests。您仍需要確定你的記錄和誰連接(因爲那時從時間到時間仍然要刪除的記錄

最後一個策略:把你的球回家獲取表中。說明您想要它,使數據泵的出口。對於額外的鬥氣,你可以在這一點上截斷表,然後你想用你運行一個數據泵導入表的任何時間,這將重置表的狀態,消滅任何現有的數據,這只是測試腳本創建自己的數據的極端版本​​。