Я хотел бы реализовать ограничение для следующей таблицы:
CREATE TABLE GLOBAL_LOCKS
(
RESOURCE_NAME VARCHAR2(50) NOT NULL,
IS_EXCLUSIVE CHAR(1) DEFAULT 'N' NOT NULL
)
следующим образом:
- RESOURCE_NAME должно быть уникальным, если IS_EXLUSIVE = 'Y'
- RESOURCE_NAME может быть дубликатом, если все записи имеют IS_EXCLUSIVE = 'N'
--Example 1
INSERT INTO GLOBAL_LOCKS(RESOURCE_NAME, IS_EXCLUSIVE)
VALUES ('MY_RESOURCE', 'Y');
INSERT INTO GLOBAL_LOCKS(RESOURCE_NAME, IS_EXCLUSIVE)
VALUES ('MY_RESOURCE', 'N');
-- should fail
--Example 2
INSERT INTO GLOBAL_LOCKS(RESOURCE_NAME, IS_EXCLUSIVE)
VALUES ('MY_RESOURCE', 'N');
INSERT INTO GLOBAL_LOCKS(RESOURCE_NAME, IS_EXCLUSIVE)
VALUES ('MY_RESOURCE', 'N');
-- should work
--Example 3
INSERT INTO GLOBAL_LOCKS(RESOURCE_NAME, IS_EXCLUSIVE)
VALUES ('MY_RESOURCE', 'N');
INSERT INTO GLOBAL_LOCKS(RESOURCE_NAME, IS_EXCLUSIVE)
VALUES ('MY_RESOURCE', 'N');
INSERT INTO GLOBAL_LOCKS(RESOURCE_NAME, IS_EXCLUSIVE)
VALUES ('MY_RESOURCE', 'Y');
-- should fail
Идея состоит в том, чтобы поддерживать исключительные и общие блокировки в этой таблице и полагаться на ограничениеобеспечить целостность.Для данного ресурса может быть только одна исключительная блокировка;но для данного ресурса может быть несколько общих блокировок.
Этот вопрос похож на https://asktom.oracle.com/pls/apex/asktom.search?tag=how-to-enforce-conditional-unique-on-multiple-columns, но решение не работает для этого случая из-за требования # 1