2012-06-11 18 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。您仍需要确定你的记录和谁连接(因为那时从时间到时间仍然要删除的记录

最后一个策略:把你的球回家获取表中。说明您想要它,使数据泵的出口。对于额外的斗气,你可以在这一点上截断表,然后你想用你运行一个数据泵导入表的任何时间,这将重置表的状态,消灭任何现有的数据,这只是测试脚本创建自己的数据的极端版本​​。