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