我有一个很多行的表。
为了测试目的,我的同事也使用同一张表。问题是,他有一段时间删除了我正在测试的行和一些时间I.
那么在oracle中有什么方法可以让某些特定的行只能读取,所以其他的不应该删除和编辑它?使表中的行只读在oracle上?
谢谢。
我有一个很多行的表。
为了测试目的,我的同事也使用同一张表。问题是,他有一段时间删除了我正在测试的行和一些时间I.
那么在oracle中有什么方法可以让某些特定的行只能读取,所以其他的不应该删除和编辑它?使表中的行只读在oracle上?
谢谢。
您可以创建一个防止删除某些特定行的触发器。
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好的亲爱的。 – Addicted
有许多不同的方法来解决这个问题。
由于Sun Tzu said,如果您和您的同事使用不会发生碰撞的数据集,那么最好的办法是。
例如,也许你可以在本地PC上各自拥有自己的数据库实例;这是否适合取决于许多因素,其中最重要的是与Oracle的许可安排。或者,您可以在共享数据库中有单独的模式;取决于你的应用程序,你可能需要给你同义词或特殊连接。
另一种方法:每个人都建立自己的数据集,称为测试夹具。这是一个很好的策略,因为测试只有在违背已知状态时才真正有效;如果我们对数据的存在或缺失做出假设,我们的测试结果的有效性如何?重点是,测试应该自行清理,删除在灯具中创建的数据和运行测试。采用这种策略,您需要同意每个团队成员的ID范围:他们只能使用其范围内的记录进行测试或开发工作。
我喜欢这些各种各样的做法,因为他们没有真正改变应用程序的工作方式(可以说,除了使用不同的模式和同义词)。更严厉的方法可用。
如果你有企业版,您可以使用行级安全性来保护您的记录。这是最后一点的延伸:您需要一种机制来识别您的记录,以及一些基础架构来识别会话中的所有权。但除了防止其他用户ROM删除你的数据,你也可以防止它们插入,更新或者甚至观看这与你的ID的范围内记录。 Find out more。
更轻的解决方案是use a trigger as A B Cade suggests。您仍需要确定你的记录和谁连接(因为那时从时间到时间你仍然要删除的记录
最后一个策略:把你的球回家获取表中。说明您想要它,使数据泵的出口。对于额外的斗气,你可以在这一点上截断表,然后你想用你运行一个数据泵导入表的任何时间,这将重置表的状态,消灭任何现有的数据,这只是测试脚本创建自己的数据的极端版本。
对于每个测试者的不同模式将是更好的解决方案 – kevinsky