Nhược điểm của việc sử dụng quy tắc là quy tắc chỉ đơn giản là viết lại truy vấn sau khi nó được phân tích cú pháp, vì vậy nếu dữ liệu được thêm thông qua trình kích hoạt, nó sẽ không kích hoạt. Sẽ an toàn hơn khi thêm ràng buộc CHECK gọi một hàm với logic của bạn. Nếu tôi làm theo đúng logic của bạn, nó sẽ giống như sau:
CREATE OR REPLACE FUNCTION check_user_client(fkc int)
RETURNS boolean AS
$$
DECLARE
i int;
BEGIN
SELECT count(*) INTO i FROM legal_entity WHERE fk_client = fkc;
IF (i > 0) THEN
RETURN true;
END IF;
SELECT count(*) INTO i FROM user_client WHERE fk_client = fkc;
IF (i = 0) THEN
RETURN true;
END IF;
RETURN false;
END
$$ LANGUAGE plpgsql;
ALTER TABLE user_client ADD CONSTRAINT unique_user CHECK (check_user_client(fk_client));