2012-12-01 3 views
4

"올바른"방법으로 DataSnap 응용 프로그램의 서버에서 내 데이터베이스에 대한 연결을 설정하려고합니다.DataSnap 및 데이터베이스 연결/로그인

데이터베이스의 각 테이블 (대부분)에는 updated 및 Created (레코드가 기록 될 때의 현재 타임 스탬프)라는 updated (필드) 값 (삽입 및 업데이트시 트리거를 통해 값이 설정 됨)이 있고 updated_by 및 created_by 현재 로그인 한 사용자를 포함해야합니다.

나는 사용자가 로그인 한 사용자를 반영하도록 클라이언트 측에서 '로그인'을 원한다. (확장하면 서버뿐만 아니라 데이터베이스에서도 사용자 인증을 얻을 수있다.) 서버에서 OnUserAuthenticate 및 OnUserAuthorize 이벤트를 처리하는 클라이언트로부터 서버 자체에 대한 인증을 처리 할 수 ​​있습니다. 그런 다음 트리거가 위에서 언급 한 필드를 올바르게 설정할 수 있도록 자격 증명을 데이터베이스에 전달하려고합니다.

그래서이 시나리오에 접근하는 방법은 무엇입니까? DSAuthProxyUser 및 DSAuthProxyPassword 클라이언트에서 사용할 수 있지만 내가 어떻게 사용하는 많은 (모든) 설명서를 찾을 수없는 경우 궁금합니다. 연결하는 모든 사용자에 대해 새로운 연결을 설정합니까? 이것은 나에게 가장 논리적 인 것 같습니다. 동시 사용자가 많지는 않습니다. 정상 30. 가장 가능성이 높은 5-10. 그러나 이것이 "정상적인"방법으로 무엇입니까? 나는 테이블에 값을 설정하기 위해 내 삽입/업데이트 각각에 사용자 이름을 전달하고 싶지 않습니다 (희망하지 않습니다).

나는 분명히 나의 상황을 설명하기를 희망한다.

감사

답변

2

나는 아직 그것을 사용하지 않은,하지만 파이어 2에 도입 된 RDB$SET_CONTEXT()RDB$GET_CONTEXT()는 당신이 필요로하는 무엇을 나에게 보인다. 이를 사용하여 사용자 세션 (네임 스페이스 USER_SESSION) 또는 현재 트랜잭션 (네임 스페이스 USER_TRANSACTION)에 대한 추가 정보를 설정하고 가져올 수 있습니다. 현재 세션 (네임 스페이스 SYSTEM)에 대한 추가 시스템 정보를 검색 할 수도 있지만 이는 해당 사례와 관련이 없습니다.

SELECT RDB$SET_CONTEXT('USER_SESSION', 'actualuser', '<name of user') 
FROM RDB$DATABASE 
다음

'actualuser'은 우리가 사용하는 환경 변수입니다 : 당신이해야 할 것이 무엇

은 (쿼리로) 사용하여 해당 OnUserAuthorize 이벤트에 RDB$SET_CONTEXT() 방법, 예를 호출합니다. 당신의 트리거에서 당신은 당신은 다음 트리거의 나머지 부분에서 actualuser을 사용할 수 있습니다

actualuser = RDB$GET_CONTEXT('USER_SESSION', 'actualuser'); 

(선언 된 변수 actualuser으로, PSQL 가정)의 이름을 검색 할 수 있습니다. 컨텍스트 변수가 설정되지 않은 경우 (예 : 관리자가 데이터베이스를 직접 변경하는 경우 등)도 고려해야합니다.

+0

'dummy_result = RDB $ SET_CONTEXT ('USER_SESSION', 'actualuser', '<사용자 이름')'이라고 쓸 수있을 것 같습니까? – mjn

+0

PSQL에서는 문서에 따라 변수에 지정하지 않고도 할 수 있습니다. "UDF와 비슷한 특성으로 인해 RDB $ SET_CONTEXT는 PSQL에서만 - void 함수처럼 호출 될 수 있습니다." 그러나 SQL에서 실행하면'RDB $ DATABASE'에 대한 질의로서 그것을 실행해야합니다. –

+0

완벽. 감사! 나는 내가 필요한 것을 위해이 일을 할 수있다. – Jason

1

파이어 버드는 SQL에서 사용할 수있는 CURRENT_USER 키워드를 가지고 있습니다. 데이터베이스 : 1 매핑

아래 예 업데이트에 대한 사용자 이름을 가지고 http://www.firebirdsql.org/refdocs/langrefupd15-current_user.html

create trigger bi_customers for customers before insert as 
begin 
    New.created_by = CURRENT_USER; 
end 

기반으로, 단순히이 솔루션은 1이 필요합니다

create trigger bi_customers for customers before update as 
begin 
    New.updated_by = CURRENT_USER; 
end 

같이 업데이트 트리거하기 전에 선언 사용자를 외부 사용자에게 알립니다.가장 간단한 구현에서는 DataSnap 세션이 데이터베이스에 대한 사용자 자격 증명을 인증한다는 의미입니다.

그러나 설명에서는 두 단계 인증 (첫 번째는 DataSnap 레이어에, 그 다음은 데이터베이스에 대해) 인 것 같습니다. 안전한 암호 처리와 관련하여 어떻게 수행 할 수 있는지, 첫 번째 인증 단계 (DataSnap)에 대한 별도의 사용자/암호 테이블과 DataSnap에서 데이터베이스로의 사용자 로그인 매핑을 일종의 '디커플링 '.

+0

OP를 이해하는 한, 데이터베이스 연결 사용자 ('CURRENT_USER')와 응용 프로그램의 논리적 사용자간에 차이가 있습니다. OP는 데이터베이스 연결의 사용자가 아닌 응용 프로그램의 논리적 사용자를 기록하려고합니다. –

관련 문제