2009-05-21 2 views
0

오라클의 내장 인증 메커니즘을 사용하여 사용자 계정과 비밀번호를 관리하는 애플리케이션을 개발 중입니다. 또한 응용 프로그램은 행 수준 보안을 사용합니다. 기본적으로 응용 프로그램을 통해 등록하는 모든 사용자는 "USERS"테이블의 일반적인 항목 대신 Oracle 사용자 이름과 암호를 가져옵니다. 사용자는 또한 특정 테이블에 레이블을받습니다. 이러한 유형의 기능을 사용하려면 DML 및 DDL 문을 여러 인스턴스에서 결합해야하지만 DDL 문이 암시 적 커밋을 수행하기 때문에 문제가 발생합니다. DDL 문 실행 후 오류가 발생하면 트랜잭션 관리가 모든 것을 롤백하지 않습니다. 테이블에단위 테스트 트랜잭션에 있어야하는 DDL 문

  1. 시작 트랜잭션
  2. 삽입 사람 세부 정보 : 새로운 사용자가 시스템에 등록 할 때 예를 들어, 일어날 수있는 다음과 같습니다. (이름, 성 등) -DML
  3. 오라클 계정 생성 (암호로 식별 된 사용자 testuser 생성) -DDL 암시 적 커밋. 거래가 종료됩니다.
  4. 새 트랜잭션이 시작됩니다.
  5. 더 많은 DML 구문 (삽입, 업데이트 등)을 수행하십시오.
  6. 오류 트랜잭션은 내가 위의 논리가 설계된대로 작동하는지 이해 4.

단계로 롤백 발생하지만 단위 테스트에 이러한 유형의 기능 어려운 그것을 발견하고 데이터를 관리하고있어 액세스 레이어. 데이터베이스가 다운되었거나 단위 테스트 중에 오류가 발생하여 테스트 스키마가 롤백 된 테스트 데이터로 오염되었습니다. 이런 일이 발생하면 테스트 스키마를 지우는 것은 쉽지만 프로덕션 환경의 데이터베이스 오류가 걱정됩니다. 나는 이것을 관리하기위한 전략을 찾고있다.

이것은 Java/Spring 응용 프로그램입니다. Spring은 트랜잭션 관리를 제공한다.

+0

.. :

이 읽기? –

+0

나는 cletus의 대답을 읽고 USERS 테이블에서보다 전통적인 접근 방식을 사용하도록 결정할 것을 강력히 권장합니다 ... –

+0

@matt b. 아니요, Oracle 계정을 만들 때 Oracle의 행 수준 보안 기능을 사용하는 경우 기존 테이블에 레이블을 추가해야 할 수 있습니다. –

답변

2

첫째로 나는 이렇게 말하고있다. 나쁜 생각은 이렇게하고있다. 두 가지 이유 :

  1. 연결은 사용자를 기반으로합니다. 즉, 연결 풀링의 이점을 대부분 잃을 수 있습니다. 그것은 또한 끔찍하게 잘 확장되지 않습니다. 한 번에 10,000 명의 사용자가있는 경우 소프트 연결 풀 대신 지속적으로 하드 연결을 열고 닫을 것입니다.
  2. 사용자를 생성하고 제거하는 것은 DML이 아닌 DDL이므로 "트랜잭션 성"을 잃게됩니다.

당신이 그것을에게이 일을 선택한하지만 강하게는 응용 프로그램에서 사용자가 아닌 데이터베이스 계층을 구현하는 것이 좋습니다 이유는 확실하지.

문제를 해결하는 방법에 관해서는 기본적으로 할 수 없습니다. 시퀀스 중간에서 테이블이나 인덱스를 생성하는 경우와 같습니다.

+0

나는 이것을 한 번 이상 upvote 할 수 있었으면 좋겠다 ... –

+0

아키텍처를 선택하지는 못했지만 행 수준의 보안을 지원하기 위해 선택되었다고 생각한다. 또한 흥미로운 점은 당신이 연결을 가져 왔다는 것입니다. 우리는 5 명의 사용자에게 다량 (약 150 개)의 연결이 소모되었음을 알았습니다. 애플리케이션은 각 요청에 대해 사용자의 자격 증명을 Spring의 UserCredentialsDataSourceAdapter에 삽입합니다. –

0

이전 의견에 동의하지 않고 내장 된 Oracle 계정 보안을 사용하면 많은 이점이 있다고합니다. 추가 정보가 포함 된 일종의 섀도우 테이블을 사용하여 이것을 늘려야하는 경우 PRAGMA AUTONOMOUS_TRANSACTION으로 선언 된 별도 패키지에 Oracle 계정 작성을 래핑하고 삽입을 수행하는 패키지에 대한 성공/실패 상태를 반환하는 방법 그림자 테이블? 나는 이것이 오라클 계정 생성을 트랜잭션으로부터 격리시킬 것이라고 생각한다.