2015-02-04 4 views
2

오라클 10g에서 삽입, 업데이트 및 삭제시 히스토리 테이블을 채우는 트리거가있는 조회 테이블이 있습니다. 트리거를 통해 히스토리 테이블의 ColdFusion 응용 프로그램에서 사용자 ID를 캡처 할 수 있기를 원합니다.웹 응용 프로그램의 Oracle 세션 변수를 신뢰할 수있는 방법으로 설정하여 웹 응용 프로그램의 값을 트리거에 전달합니까?

나는이 오라클 세션 변수를 사용하여이었다 수행하는 것으로 하나의 잠재적 인 방법

: 을 ColdFusion에서 코드에서, 내가 바로 삽입, 업데이트 전에 오라클 세션에 사용자 ID를 전달하고 코드를 삭제합니다

CALL dbms_session.set_identifier(12345); 

트리거에서 client_identifier var를 읽습니다. null 인 경우 "0"을 스와핑합니다. 단일 사용자 테스트에서

SELECT sys_context('USERENV','CLIENT_IDENTIFIER') INTO USER_ID FROM DUAL; 
    IF USER_ID IS NULL THEN 
    USER_ID   := 0; 
    END IF; 

이 잘 작동하지만 나는 CF 응용 프로그램 서버의 DB 연결이 오라클 세션에 어떻게 관련되는지 모르기 때문에, 나는 오라클 세션 VAR의 값이 신뢰할 수없는 것이라고 걱정 여러 동시 사용자.

웹 응용 프로그램의 값을 웹 응용 프로그램의 신뢰할 수있는 방법으로 설정하여 트리거에 적용하고 있습니까?

+0

답을 모르지만 cftransaction 태그가 신뢰도를 높일 수 있습니다. –

+0

완전히 다른 개념 인 세션 변수를 의미하지 않는 한 "CF 세션"자체가 없습니다. 오라클에 대해서는 잘 모르지만 일반적으로 데이터베이스에 대한 각각의 연결은 별도의 세션으로 취급됩니다. 따라서 풀에 10 개의 열린 연결이 있으면 10 개의 열린 세션이 있습니다. 무엇보다도 cftransaction을 사용하면 트랜잭션 태그 안에있는 sql에 대해 동일한 연결이 사용됩니다. – Leigh

+0

그러나 모든 cfquery 태그가 새 연결을 열지는 않습니까? 연결이 열려 있으면 새로운 쿼리가 단순히 그것을 사용하지 않을까요? –

답변

1

위에서 설명한 내용 (실행 가능하다고 생각하지 않음)을 수행하는 대신, 사용자의 사용자 ID를 저장하는 조회 테이블에 열을 추가하십시오 (MY_LOOKUP_TABLE라고 부름). 테이블에 업데이트 (또는 삽입) :

ALTER TABLE my_lookup_table 
    ADD update_user_id NUMBER DEFAULT 0 NOT NULL; 

이 (조회 테이블을 가정하면 엄청난하지 않고 당신이 모든 기존 행에 대한 기본 설정 상관하지 않습니다.)

어려움이 경우에 대한 제공 조회 테이블에서 행을 삭제해야합니다 ... 삭제 한 사용자의 ID를 어떻게 기록합니까? 이 경우 당신은 또한 아마 DELETE_FLAG, 행이 삭제 된 것을 기록하기 위해 열을 필요 : 업데이트를 기록하지 않는,

ALTER TABLE my_lookup_table 
    ADD delete_flag CHAR(1) DEFAULT 'N' NOT NULL; 

를 그런 다음 업데이트 트리거 곳 DELETE_FLAG = 'Y' :

CREATE OR REPLACE TRIGGER record_update 
AFTER UPDATE OF my_lookup_table 
FOR EACH ROW 
WHEN (new.delete_flag <> 'Y') 

및 앱이 삭제를 수행 할 때 실제로 삭제 한 다음 업데이트가 필요합니다.

<cftransaction> 
<cfquery name="update_before_delete_lookup"> 
    UPDATE my_lookup_table 
     SET update_user_id = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#user_id#" /> 
     , delete_flag = 'Y' 
    WHERE <conditions> 
</cfquery> 

<cfquery name="delete_lookup"> 
    DELETE FROM my_lookup_table 
    WHERE <conditions> 
</cfquery> 
</cftransaction> 
+0

불행히도, 그 유일한 방법처럼 보입니다. 나는 실제로 트리거에 값을 전달하기를 바랬으므로 그렇게 두 번 단계를 거치지 않아도됩니다. –