3

我有一张有很多行的表。
出于测试目的,我的同事也使用同一张桌子。问题是他有时会删除我正在测试的行,有时会删除我。
那么在 oracle 中有什么方法可以使某些特定的行只读,因此其他人不应该删除和编辑它?

谢谢。

4

3 回答 3

4

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

正如孙子所说,最好的办法是您和您的同事使用不会发生冲突的数据集。

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

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

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

如果您有企业版,则可以使用行级安全性来保护您的记录。这是最后一点的延伸:您将需要一种机制来识别您的记录,以及一些基础设施来识别会话中的所有权。但是除了阻止其他用户删除您的数据之外,您还可以阻止他们插入、更新甚至查看您的 ID 范围内的记录。 了解更多

一个较轻的解决方案是使用 AB Cade 建议的触发器。您仍然需要识别您的记录和连接的人(因为可能不时仍想删除您的记录。

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

于 2012-06-11T13:14:44.627 回答
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等等。

于 2012-06-11T10:48:15.110 回答
-1

Oracle 支持行级锁定。您可以阻止其他人删除您正在使用的行。为了更好地了解这个链接

于 2012-06-11T10:58:17.210 回答