2014-06-23 3 views
0

가상 개인 데이터베이스 정책의 번호를 가지고예상 UDT는 내가 문제 다음 한

FUNCTION app_user_is_master_owner(
    schema_in IN VARCHAR2, 
    object_in IN VARCHAR 
) 
RETURN VARCHAR2 
IS return_value VARCHAR2(100); 
BEGIN 
SELECT 'OWNER_FK = ' || 
    (SELECT mo.owner_id 
    FROM MASTER_OWNER mo 
    WHERE upper(mo.owner_name) = SYS_CONTEXT('USERENV', 'SESSION_USER')) || 
    ' OR OWNER_FK IS EMPTY' 
    INTO return_value 
    FROM DUAL; 
RETURN return_value; 
END app_user_is_master_owner; 

내가 ADD_POLICY 전화를 DBMS_RLS에서 다른 policys

BEGIN 
DBMS_RLS.ADD_POLICY(
object_schema => 'MY_SCHEMA', 
object_name => 'MASTER_DATA', 
policy_name => 'app_user_is_mo_policy', 
function_schema => 'MY_SCHEMA', 
policy_function => 'MY_RLS_POLICYS.app_user_is_master_owner', 
statement_types => 'SELECT, INSERT, UPDATE, DELETE' 
); 
END; 

내가 SQL 내에서 플러스 절은 반환 ''RLS 정책 기대로 추가하지 않고 함수를 호출

에 추가하기

SQL> select my_rls_policys.app_user_is_master_owner('A','A') from dual; 
MY_RLS_POLICYS.APP_USER_IS_MASTER_OWNER('A','A') 
-------------------------------------------------------------------------------- 
OWNER_FK = 4000 OR OWNER_FK IS EMPTY 

하지만 VPD 정책으로 호출하면이 오류 메시지가 표시됩니다.

SQL> SELECT * FROM MASTER_DATA; 
SELECT * FROM MASTER_DATA 
         * 
ERROR at line 1: 
ORA-00932: inconsistent datatypes: expected UDT got NUMBER 

나는 결과가 선택이 아닌 VARCHAR이지만,에 TO_CHAR를 추가하는 것은 어느 쪽도 "TO_CHAR (RETURN_VALUE를) 반환" "TO_CHAR 선택 (...) RETURN_VALUE에"나를 해결하는 것 없기 때문에 것 같아요 문제.

다른 policys는 잘 동작합니다.

도움 주셔서 감사합니다. 마티아스

답변

0

변수에 소유자를 가져 오는 시도하고 내가 is null로 변경 ... is empty이 무엇을 의미하는지

function app_user_is_master_owner(
    schema_in in varchar2, 
    object_in in varchar 
) return varchar2 
is 
    predicate varchar2(100); 
    owner_id master_owner.owner_id%type; 
begin 
    select owner_id 
    into owner_id 
    from master_owner 
    where upper(owner_name) = sys_context('userenv', 'session_user'); 

    predicate := '(owner_fk = ' || owner_id || ' or owner_fk is null)'; 

    return predicate; 
end app_user_is_master_owner; 

P.S 확실하지 연결할.

+0

그러면 해결됩니다. 고마워요! – mSchnell

+0

두 가지 더 많은 것들이 있는데, predicate (일반적으로 synamic string ~ varchar2 (4001)의 한계를 사용)와 같이 생성 된 문자열에 대해 더 큰 크기를 정의하고 'NO_DATA_FOUND'에 대한 대소 문자를 추가하십시오. – haki

+0

지금 생각해 보겠습니다. 지금 시도하고있는 튜토리얼의 예입니다. 그러나 충고에 감사드립니다. – mSchnell