在oracle上只读表中的行?

时间:2012-06-11 10:37:19

标签: oracle oracle10g

我有一张有很多行的表 出于测试目的,我的同事也使用相同的表格。问题是,有时他会删除我正在测试的行,有时候会删除 那么在oracle中是否有任何方法,所以我可以使一些特定的行只读,所以其他不应该删除和编辑?

感谢。

3 个答案:

答案 0 :(得分:4)

有许多不同的方法可以解决这个问题。

作为Sun Tzu said,如果您和您的同事使用不会发生冲突的数据集,那将是最好的选择。

例如,也许您可​​以在本地PC上拥有自己的数据库实例;这是否适合取决于许多因素,其中最重要的是您与Oracle的许可安排。或者,您可以在共享数据库中使用单独的模式;根据您的应用,您可能需要同义词或特殊连接。

另一种方法:每个人都建立自己的数据集,称为测试夹具。这是一个很好的策略,因为测试只有在针对已知状态运行时才真正有效;如果我们对数据的存在与否做出假设,我们的测试结果有效吗?关键是,测试应该自行清理,删除在灯具中创建的任何数据以及运行测试。使用此策略,您需要同意每个团队成员的ID范围:他们必须仅使用其范围内的记录进行测试或开发工作。

我更喜欢这些方法,因为它们并没有真正改变应用程序的工作方式(可以说除了使用不同的模式和同义词)。有更多严苛的方法可供选择。

如果您拥有Enterprise Edition,则可以使用行级安全性来保护您的记录。这是最后一点的扩展:您需要一种机制来识别您的记录,以及一些用于识别会话内所有权的基础架构。但是,除了阻止其他用户删除您的数据之外,您还可以阻止他们插入,更新甚至查看具有您的ID范围的记录。 Find out more

较轻的解决方案是use a trigger as A B Cade suggests。您仍然需要识别您的记录和已连接的人(因为可能会不时地仍然希望删除您的记录。

最后一个策略:把球带回家。获取所需状态的表并进行数据泵导出。为了获得额外的报复性,您可以在此时截断表格。然后,只要您想使用该表,就可以运行数据泵导入。这将重置表的状态,消除任何现有数据。这只是创建自己数据的测试脚本的极端版本​​。

答案 1 :(得分: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等等

答案 2 :(得分:-1)

Oracle支持行级锁定。您可以阻止其他人删除您正在使用的行。了解更好的检查this link