【发布时间】:2021-10-10 08:26:24
【问题描述】:
我有一个问题,我无法实现的自治事务将尝试将数据插入表中,但数据可能已经存在。我们需要找到一种解决方案来处理唯一完整性约束,而不需要移除约束,因为另一个程序依赖于这个约束验证。
我尝试创建一个删除现有条目的前触发器,但这似乎不起作用。
CREATE OR REPLACE TRIGGER TG_BEFORE_INSERT_REPLACE_DC_DEVICE_TACTICAL_FIX_INV_LOADER
BEFORE INSERT
ON DC_DEVICE
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
FAKE_DEVICE_STATUS VARCHAR2(3 BYTE);
BEGIN
-- constraint exception occurs before this statement
DELETE FROM DC_DEVICE WHERE DEVICE_ID_PK = :NEW.DEVICE_ID_PK;
END;
在那之后,我想到了删除约束并添加带有条件语句的触发器,来自损坏程序的所有条目都是不同的,所以我可以区分它们。使用该语句,如果设备已经存在并且插入不是来自损坏的程序,则无法继续,否则删除现有条目并继续插入。
上面的解决方案似乎是一个可行的解决方案,但我的问题是,是否有任何功能可以让我以更优雅的方式做同样的事情?
【问题讨论】:
-
这似乎是应用程序插入数据的问题,它应该使用合并或处理违反唯一约束。无论如何,一个想法是重命名表并在其前面放置一个视图,然后您可以添加而不是触发器将违规行放入异常表中。
-
您想对您尝试插入的违反约束的记录做什么?你想保留它们,你想替换现有的?
-
我想替换记录,但我无法更改应用程序的查询,我们无法控制代码,但我们必须找到解决方案...
-
您如何区分这些记录?您可能希望使用基于函数的索引来创建条件唯一约束。
-
如果设备状态 != 'FKE' 那么 device_id 应该是唯一的吗?如果是这样,您可以使用基于函数的索引来实现。