我有一个带有邮政编码列的表格(荷兰语格式,但没关系)
CREATE TABLE "TEST"
(
"ID" NUMBER(10) NOT NULL ENABLE,
"POSTALCODE" VARCHAR2(6) NOT NULL ENABLE,
....
CONSTRAINT "TEST_PK" PRIMARY KEY ("ID") ENABLE
)
我正在尝试创建一个触发器来限制具有重复邮政编码的记录数量;一次只能有两行包含相同的邮政编码。 我尝试了以下代码:
CREATE OR REPLACE TRIGGER TR_TEST_PC
BEFORE UPDATE OR INSERT OF "POSTALCODE " ON "TEST"
FOR EACH ROW
WHEN ( OLD.POSTALCODE <> NEW.POSTALCODE )
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_count
FROM TEST
WHERE POSTALCODE = :NEW.POSTALCODE ;
IF (v_count > 2) THEN
raise_application_error(-20000, 'Max. 2 rows with same postal code.');
END IF;
END TR_TEST_PC;
但这会返回一个错误:
ORA-04091: table MYDB.TEST is mutating, trigger/function may not see it
ORA-06512: at "MYDB.TR_TEST_PC", line 4
ORA-04088: error during execution of trigger 'MYDB.TR_TEST_PC'
我知道这是因为您无法访问正在更改的表。
如何制作一个触发器来确保不超过 2 条记录包含相同的邮政编码?
请您参考如下方法:
这可能会代替你的触发器起作用:
CREATE MATERIALIZED VIEW mv_my
BUILD IMMEDIATE
REFRESH FAST ON COMMIT AS
SELECT POSTALCODE, COUNT(*) AS cnt FROM TEST GROUP BY POSTALCODE
/
ALTER TABLE mv_my ADD CHECK(cnt < 2)
/
让我知道。 干杯,
塞巴斯