A = 더하기 , D = 지우기
만약에 역할이 3개이상 업데이트 되었을 때
ex) BUSAN,4|SEOUL,3|DAEJEON,1
ACCU_AUTH(누적된역할)컬럼이 가운데 값을 지우는 쿼리문을 프로시저로 작성하려고합니다.
그 비교문을 어떤 형식을 짜야할지 의견 부탁드립니다.!
CREATE TABLE emp7
( eid VARCHAR2(20)
, auth VARCHAR2(20)
, acu_auth VARCHAR2(99)
, CONSTRAINT pk_emp7 PRIMARY KEY(eid)
)
;
CREATE OR REPLACE TRIGGER tri_emp7
BEFORE INSERT OR UPDATE OF auth
ON emp7
FOR EACH ROW
DECLARE
v_gb VARCHAR2(1) := SUBSTR(:NEW.AUTH, -1);
v_v VARCHAR2(20) := SUBSTR(:NEW.AUTH, 1, LENGTH(:NEW.AUTH)-2);
BEGIN
IF v_gb = 'A' THEN
:NEW.acu_auth := :NEW.acu_auth ||'|'|| v_v;
ELSIF v_gb = 'D' THEN
:NEW.acu_auth := REPLACE(:NEW.acu_auth, v_v);
:NEW.acu_auth := LTRIM(RTRIM(REPLACE(:NEW.acu_auth, '||', '|'), '|'), '|');
END IF;
END;
/
INSERT INTO emp7(eid, auth) VALUES('admin', 'DAEJEON,1,A');
SELECT * FROM emp7 WHERE eid = 'admin';
UPDATE emp7 SET auth = 'SEOUL,3,A' WHERE eid = 'admin';
UPDATE emp7 SET auth = 'BUSAN,3,A' WHERE eid = 'admin';
UPDATE emp7 SET auth = 'BUSAN,3,D' WHERE eid = 'admin';
이렇게 관리하시는 것보다는 테이블 정규화를 하시기를 권장합니다.
감사합니다 마농님! 많은걸 배웠습니다!
트리거로 한 번 해보려 했다가 BEFORE가 아닌 AFTER로 해야 하는줄 알고 해보려다 오류가 계속 나서
BEFORE로도 해보다 값이 안바껴서 포기하고 있었는데 많은 도움 감사드립니다!