Tôi đang cố gắng sao chép logic nghiệp vụ thể hiện một ứng dụng web C # mạng nội bộ trong cơ sở dữ liệu để các cơ sở dữ liệu khác có thể truy cập nó và hoạt động theo cùng một quy tắc. "Quy tắc" này có vẻ khó thực hiện nếu không sử dụng hack.
CREATE TABLE CASE_STAGE
(
ID NUMBER(9) PRIMARY KEY NOT NULL,
STAGE_ID NUMBER(9) NOT NULL,
CASE_PHASE_ID NUMBER(9) NOT NULL,
DATE_CREATED TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL,
END_REASON_ID NUMBER(9),
PREVIOUS_CASE_STAGE_ID NUMBER(9),
"CURRENT" NUMBER(1) NOT NULL,
DATE_CLOSED TIMESTAMP(6) DEFAULT NULL
);
và
CREATE TABLE CASE_RECOMMENDATION
(
CASE_ID NUMBER(9) NOT NULL,
RECOMMENDATION_ID NUMBER(9) NOT NULL,
"ORDER" NUMBER(9) NOT NULL,
DATE_CREATED TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL,
CASE_STAGE_ID NUMBER(9) NOT NULL
);
ALTER TABLE CASE_RECOMMENDATION ADD (
CONSTRAINT SYS_C00000
PRIMARY KEY
(CASE_ID, RECOMMENDATION_ID));
Logic kinh doanh có thể được tóm tắt là
When Inserting into CASE_STAGE
If CASE_STAGE.STAGE_ID = 1646
THEN
CASE_STAGE.PREVIOUS_STAGE_ID must be found in CASE_RECOMMENDATION.CASE_STAGE_ID
Logic này có thể được thể hiện trong một ràng buộc Kiểm tra hay là một kích hoạt xấu xí là cách duy nhất?
Biên tập:
- Đối với tất cả các giá trị của CASE_STAGE.STAGE_ID, giá trị cho PREVIOUS_STAGE_ID phải được tìm thấy trong CASE_STAGE.ID
- Ứng dụng không cho phép xóa khỏi CASE_RECOMMENDATION một khi nó không còn HIỆN TẠI (tức là khi giá trị của CASE_STAGE.CURRENT là 0 thì giai đoạn này đã bị đóng và không thể thay đổi nữa, khi = 1 đây là giai đoạn hoặc hàng, đang hoạt động và có thể thay đổi ngay bây giờ.)
Chỉnh sửa: sử dụng tất cả các ý tưởng và nhận xét xuất sắc ở đây là một giải pháp hiệu quả cho vấn đề này
CREATE MATERIALIZED VIEW LOG ON CASE_STAGE
TABLESPACE USERS
STORAGE (
BUFFER_POOL DEFAULT
)
NOCACHE
LOGGING
NOPARALLEL
WITH ROWID;
CREATE MATERIALIZED VIEW LOG ON CASE_RECOMMENDATION
TABLESPACE USERS
STORAGE (
BUFFER_POOL DEFAULT
)
NOCACHE
LOGGING
NOPARALLEL
WITH ROWID;
CREATE MATERIALIZED VIEW CASE_RECOMMENDATION_MV REFRESH FAST ON COMMIT AS
SELECT
cr.ROWID cr_rowid, --necessary for fast refresh
cs.ROWID cs_rowid, --necessary for fast refresh
cr.case_id,
cs.stage_id,
cr.recommendation_id
cr.case_stage_id,
cs.previous_case_stage_id
FROM CASE_RECOMMENDATION cr,
case_stage cs
WHERE cs.previous_case_stage_id = cr.case_stage_id (+)
AND CS.PREVIOUS_CASE_STAGE_ID IS NOT NULL
AND EXTRACT (YEAR FROM CS.DATE_CREATED) > 2010 --covers non conforming legacy data
AND CR.RECOMMENDATION_ID IS NULL
AND cs.stage_id =1646;
--this last line excludes everything but problem cases due to the outer join
ALTER TABLE CASE_RECOMMENDATION_MV ADD CONSTRAINT CASE_RECOMMENDATION_ck CHECK (
(previous_case_stage_id IS NOT NULL AND case_stage_id IS NOT NULL)
);
Khi chèn giai đoạn 1646 bằng các gói hiện có mà không có khuyến nghị, lỗi là
ORA-12008: error in materialized view refresh path
ORA-02290: check constraint (APPBASE.CASE_RECOMMENDATION_MV_C01) violated
ORA-06512: at line 49
Công việc hoàn thành! Không phải những gì một khung nhìn cụ thể hóa được dự định nhưng tốt hơn là một kích hoạt.
1646
? Là thay đổi thiết kế (tách bảng thành hai) là một tùy chọn?
CASE_RECOMMENDATION.CASE_STAGE_ID
duy nhất?