我有一张有很多行的表。
出于测试目的,我的同事也使用同一张桌子。问题是他有时会删除我正在测试的行,有时会删除我。
那么在 oracle 中有什么方法可以使某些特定的行只读,因此其他人不应该删除和编辑它?
谢谢。
有许多不同的方法可以解决这个问题。
正如孙子所说,最好的办法是您和您的同事使用不会发生冲突的数据集。
例如,也许您每个人都可以在本地 PC 上拥有自己的数据库实例;这是否适合取决于许多因素,其中最重要的是您与 Oracle 的许可安排。或者,您可以在共享数据库中拥有单独的模式;根据您的应用程序,您可能需要同义词或特殊连接词。
另一种方法:每个人都构建自己的数据集,称为测试夹具。这是一个很好的策略,因为测试只有在针对已知状态运行时才真正有效;如果我们对数据的存在或不存在做出假设,我们的测试结果有多有效?关键是,测试应该自己清理,删除在夹具中创建的任何数据以及运行测试。使用这种策略,您需要就每个团队成员的 ID 范围达成一致:他们只能将其范围内的记录用于测试或开发工作。
我更喜欢这种方法,因为它们并没有真正改变应用程序的工作方式(可以说,除了使用不同的模式和同义词)。可以使用更严厉的方法。
如果您有企业版,则可以使用行级安全性来保护您的记录。这是最后一点的延伸:您将需要一种机制来识别您的记录,以及一些基础设施来识别会话中的所有权。但是除了阻止其他用户删除您的数据之外,您还可以阻止他们插入、更新甚至查看您的 ID 范围内的记录。 了解更多。
一个较轻的解决方案是使用 AB Cade 建议的触发器。您仍然需要识别您的记录和连接的人(因为可能不时您仍想删除您的记录。
最后一个策略:把你的球带回家。使表格处于您想要的状态并进行数据泵导出。为了额外的报复,您可以在此时截断表格。然后,只要您想使用该表,您就可以运行数据泵导入。这将重置表的状态,清除所有现有数据。这只是创建自己的数据的测试脚本的极端版本。
您可以创建一个触发器来防止删除某些特定行。
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等等。
Oracle 支持行级锁定。您可以阻止其他人删除您正在使用的行。为了更好地了解这个链接。