내용 목차
본 장에서는 DBMS_RLS 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.
DBMS_RLS 패키지는 Tibero의 가상 개인 데이터베이스 기능을 구성하고 관리하는 데 사용할 수 있는 프러시저와 함수를 제공한다.
가상 개인 데이터베이스에서는 테이블, 뷰, 동의어에 대해 동적으로 조건문을 생성하여 해당 스키마 객체에서 반환하는 로우에 대한 접근을 선택적으로 제한한다. 동적 조건문은 문자열을 반환하는 PSM 함수를 통해 만들 수 있으며, 이 함수를 추가되는 보안 정책과 연결시켜 줌으로써 정책이 구현된다. 다음의 예를 보자.
DBMS_RLS.ADD_POLICY ('scott', 'emp', 'pol1', 'secadm', 'emp_sec', 'select');
pol1 이라는 정책을 통해서, scott 스키마의 emp 테이블을 select 할 때마다, Tibero 는 secadm의 emp_sec 함수를 호출하여 조건문을 동적으로 만들게 되고, 그 조건문을 where 절로 추가하여 실제 select를 수행한다.
동적 조건문을 생성하기 위해 현재의 상황(혹은 조건)을 조사할 필요가 생기는데, 이때 보통 애플리케이션 문맥 기능을 이용한다. 해당 내용은 DBMS_SESSION 패키지 및 SYS_CONTEXT 내장 함수를 참조한다.
본 절에서는 DBMS_RLS 패키지에서 제공하는 프러시저와 함수를 알파벳 순으로 설명한다.
해당 테이블, 뷰, 동의어에 대해 가상 개인 데이터베이스 보안 정책을 추가한다. 이 프러시저는 호출됨과 동시에 현재 트랜잭션을 커밋시킨다.
정책 함수는 다음의 함수 프로토타입에 맞추어 작성해야만 한다.
FUNCTION policy_function (object_schema IN VARCHAR2, object_name VARCHAR2) RETURN VARCHAR2;
object_schema, object_name 에는 해당 정책을 적용한 테이블, 뷰, 동의어의 스키마 이름과 객체의 이름이 전달된다.
ADD_POLICY 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_RLS.ADD_POLICY ( object_schema IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2, policy_name IN VARCHAR2, function_schema IN VARCHAR2 DEFAULT NULL, policy_function IN VARCHAR2, statement_types IN VARCHAR2 DEFAULT NULL, update_check IN BOOLEAN DEFAULT FALSE, enable IN BOOLEAN DEFAULT TRUE, static_policy IN BOOLEAN DEFAULT FALSE, policy_type IN BINARY_INTEGER DEFAULT NULL, sec_relevant_cols IN VARCHAR2 DEFAULT NULL, set_relevant_cols_opt IN BINARY_INTEGER DEFAULT NULL );
파라미터
파라미터 | 설명 |
---|---|
object_schema | 테이블, 뷰, 동의어를 가지고 있는 스키마이다. 명시하지 않으면 현재 사용자의 스키마이다. |
object_name | 테이블, 뷰, 동의어의 이름이다. |
policy_name | 새로 추가하고자 하는 정책의 이름이다. 해당 스키마 객체에 대해 유일해야 한다. |
function_schema | 조건문 생성 함수의 스키마이다. 명시하지 않으면 현재 사용자의 스키마이다. |
policy_function | 조건문 생성 함수의 이름이다. 패키지 내에 존재한다면 패키지 이름과 함께 명시한다. |
statement_types | 정책을 적용할 SQL 문의 유형이다. SELECT, INSERT, UPDATE, DELETE의 조합을 명시할 수 있다. 기본값은 이 4개를 모두 명시한 것이다. |
update_check | INSERT, UPDATE일 경우에 적용된다. TRUE일 경우 새로 insert되거나 update된 값이 정책의 조건문을 만족하는지 검사한다. (기본값: FALSE) |
enable | 정책을 추가함과 동시에 활성화시킬지 명시한다. (기본값: TRUE) |
static_policy | 정책 유형을 설정한다. policy_type이 지정되지 않을 경우에만 유효하다.
|
policy_type | 정책 유형을 설정한다. (기본값: NULL) 가능한 정책 유형 다음과 같다.
|
sec_relevant_cols | 컬럼 레벨 VPD 기능을 활성화한다. 조건문 함수의 결과에 따라 값을 NULL로 가릴 컬럼들의 이름을 명시한다. 이름은 쉼표 혹은 공백 문자로 구분할 수 있다. 이 인자는 테이블 혹은 뷰에 대해 명시가 가능하며, 동의어에 대해서는 명시가 불가능하다. (기본값: NULL, 컬럼 레벨 VPD 기능을 사용하지 않음) |
sec_relevant_cols_opt | 가능한 값은 NULL(디폴트) 혹은 dbms_rls.ALL_ROWS 둘 중 하나이다. set_relevant_cols 인자를 통해 컬럼 레벨 VPD 기능을 활성화시켰을 경우에 이 인자의 값은 dbms_rls.ALL_ROWS 이어야 하며, 그렇지 않을 경우에는 NULL이어야 한다. |
예제
BEGIN DBMS_RLS.ADD_POLICY ( object_schema=>'scott', object_name=>'emp', policy_name=>'pol1', function_schema=>'secadm', policy_function=>'emp_sec', statement_types=>'insert,update', policy_type=>DBMS_RLS.CONTEXT_SENSITIVE); END; /
해당 테이블, 뷰, 동의어에 대해 걸려 있는 가상 개인 데이터베이스 보안 정책을 제거한다. 이 프러시저는 호출됨과 동시에 현재 트랜잭션을 커밋시킨다.
DROP_POLICY 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_RLS.DROP_POLICY ( object_schema IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2, policy_name IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
object_schema | 테이블, 뷰, 동의어를 가지고 있는 스키마이다. 명시하지 않으면 현재 사용자의 스키마이다. |
object_name | 테이블, 뷰, 동의어의 이름이다. |
policy_name | 제거하고자 하는 정책의 이름이다. |
해당 테이블, 뷰, 동의어에 대해 걸려 있는 가상 개인 데이터베이스 보안 정책을 활성화 혹은 비활성화한다. 이 프러시저는 호출됨과 동시에 현재 트랜잭션을 커밋시킨다.
ENABLE_POLICY 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_RLS.ENABLE_POLICY ( object_schema IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2, policy_name IN VARCHAR2, enable IN BOOLEAN DEFAULT TRUE );
파라미터
파라미터 | 설명 |
---|---|
object_schema | 테이블, 뷰, 동의어를 가지고 있는 스키마이다. 명시하지 않으면 현재 사용자의 스키마이다. |
object_name | 테이블, 뷰, 동의어의 이름이다. |
policy_name | 활성화 혹은 비활성할 정책의 이름이다. |
enable |
|
이 프러시저를 호출하면 해당 보안 정책으로 인해 영향을 받았던 실행 계획들과 메모리에 저장되어 있던 정책 함수의 결과들을 모두 무효화시킨다. 결과적으로 SQL 문이 다시 수행될 때 문장은 다시 파싱되며, 정책 함수는 다시 수행된다. 비활성화된 정책에 대해 이 프러시저를 호출하면 에러가 반환된다.
REFRESH_POLICY 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_RLS.REFRESH_POLICY ( object_schema IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2, policy_name IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
object_schema | 테이블, 뷰, 동의어를 가지고 있는 스키마이다. 명시하지 않으면 현재 사용자의 스키마이다. |
object_name | 테이블, 뷰, 동의어의 이름이다. |
policy_name | Refresh하고자 하는 정책의 이름이다. |