문제

Oracle의 내장 인증 메커니즘을 사용하여 사용자 계정 및 비밀번호를 관리하는 응용 프로그램을 작업 중입니다. 응용 프로그램은 또한 행 수준 보안을 사용합니다. 기본적으로 응용 프로그램을 통해 등록하는 모든 사용자는 "사용자"테이블의 일반적인 항목 대신 Oracle 사용자 이름과 비밀번호를 가져옵니다. 사용자는 특정 테이블에 라벨을받습니다. 이러한 유형의 기능은 많은 경우 DML 및 DDL 문의 실행을 결합해야하지만 DDL 문이 암시 적 커밋을 수행하기 때문에 문제가 발생합니다. DDL 명령문이 실행 된 후 오류가 발생하면 트랜잭션 관리가 모든 것을 롤백하지 않습니다. 예를 들어, 새 사용자가 시스템에 등록하면 다음이 발생할 수 있습니다.

  1. 트랜잭션을 시작하십시오
  2. 사람 세부 정보를 테이블에 삽입하십시오. (예 : 이름, 성 등) -dml
  3. Oracle 계정을 만듭니다 (비밀번호로 식별 된 사용자 testuser 만들기;) -ddl 암시 적 커밋. 트랜잭션이 끝납니다.
  4. 새로운 거래가 시작됩니다.
  5. 더 많은 DML Statments (삽입, 업데이트 등)를 수행하십시오.
  6. 오류가 발생하면 트랜잭션은 4 단계로만 롤백됩니다.

위의 논리가 설계된대로 작동한다는 것을 이해하지만이 유형의 기능을 테스트하고 데이터 액세스 계층에서 관리하기가 어렵다는 것을 알고 있습니다. 데이터베이스가 다운되었거나 단위 테스트 중에 오류가 발생하여 테스트 스키마가 롤백 된 테스트 데이터로 오염되었습니다. 이런 일이 발생할 때 테스트 스키마를 닦을 수는 있지만 프로덕션 환경에서 데이터베이스 고장이 걱정됩니다. 나는 이것을 관리하기위한 전략을 찾고 있습니다.

이것은 Java/Spring 응용 프로그램입니다. Spring은 거래 관리를 제공하고 있습니다.

도움이 되었습니까?

해결책

행 수준 보안과 함께 Oracle Proxy 인증을 사용해야합니다.

이것을 읽으십시오 : http://www.oracle.com/technology/pub/articles/dikmans-toplink-security.html

다른 팁

먼저 나는 이런 식으로 그렇게하는 나쁜 생각입니다. 두 가지 이유로 :

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

왜 당신 이이 일을하기로 선택했는지 잘 모르겠지만 강하게 데이터베이스 계층이 아닌 응용 프로그램에서 사용자를 구현하는 것이 좋습니다.

문제를 해결하는 방법에 관해서는 기본적으로 할 수 없습니다. 시퀀스 중간에 테이블이나 색인을 만드는 것과 동일합니다.

이전 의견 중 일부에 동의하지 않으며 내장 된 Oracle 계정 보안을 사용하는 데는 많은 장점이 있다고 말할 것입니다. 추가 정보가있는 일종의 그림자 테이블로이를 강화 해야하는 경우, Pragma Autonomous_Transaction으로 선언 된 별도의 패키지로 Oracle 계정 작성을 포장하고 삽입을 수행하는 패키지에 성공/실패 상태를 반환하는 것은 어떻습니까? 그림자 테이블? 나는 이것이 거래에서 Oracle 계정 생성을 격리시킬 것이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top