2016-04-04 11 views
2

Tabloda bir yüklem işlevi uygulamaya çalışıyorum. paket ve yüklem fonksiyon hiçbir sorunları ile derlemek, ama masaya seçtiğinizde, bu hatayı alıyorsunuz: Burada VPD yüklem işlevinin uygulanması - ORA-28110: ilke işlevi veya paketinde hata var

SELECT * FROM MSGG_GUIDES; 

ORA-28110: policy function or package VPD674.MSGG_SECURITY_POLICY has error 

Ben tanımladığınız fonksiyonudur. Aşağıdaki kod, paket gövdesinden, işlevin bir parçası olduğu bir pasajdır. Son hedefim, bu fonksiyonun if ifadelerinde gördüğünüz 4 tablo için bir politika tanımlamasını sağlamaktır. Bu tablo, söz konusu tabloya nasıl uygulanır (İşte seçeceğim).

BEGIN 
DBMS_RLS.ADD_POLICY(
    object_schema => 'VPD674', 
    object_name => 'MSGG_GUIDES', 
    policy_name => 'MSGG_SECURITY_POLICY1', 
    function_schema => 'VPD674', 
    policy_function => 'MSGG_SECURITY_POLICY', 
    statement_types => 'SELECT'); 

END; 
/

Seçimin neden hatalı olduğunu belirten herhangi bir fikir var mı? Fonksiyon, sorunsuz bir şekilde derlenir. Paket, işlev veya ilkedeki "hataları göster" komutu, "hata yok" ifadesini döndürür. Bir sorun giderme adımı olarak get_user_id işlevini kullanmayan bir işlev kodlanmış bir sürümünü denedim, ancak yine de aynı hatayı alıyorum. Ayrıca, paketin dışında işlev oluşturmayı ve onu ilkeye uygulamayı denedim, ancak aynı hatayı aldım.

Tam açıklama için, paket belirtiminin tamamı ve gövde oluşturma komut dosyası aşağıdadır. Bahsettiğim kodlanmış işlev sürümünü göreceksiniz (MSGG_SECURITY_POLICY_G).

CREATE OR REPLACE PACKAGE MSGG_SESSION AS 
    PROCEDURE authenticate (current_username varchar2, current_password varchar2); 
    function get_user_id 
    RETURN NUMBER; 
    function MSGG_SECURITY_POLICY (schema_in varchar2, NAME_IN varchar2) 
    RETURN VARCHAR2; 
    function MSGG_SECURITY_POLICY_G (schema_var IN VARCHAR2, table_var IN VARCHAR2) 
    RETURN VARCHAR2; 
end MSGG_SESSION; 
/

CREATE OR REPLACE PACKAGE BODY MSGG_SESSION AS 
    person_id_var NUMBER; 

    function get_user_id 
     return NUMBER IS BEGIN 

      return(person_id_var); 

     end get_user_id; 

    PROCEDURE authenticate (current_username varchar2, current_password varchar2) IS BEGIN 

      SELECT personID 
     INTO person_id_var 
      FROM MSGG_USER 
      WHERE (current_username=username and current_password=password); 

     DBMS_OUTPUT.put_line(person_id_var); 

     END authenticate; 

    function MSGG_SECURITY_POLICY (schema_in varchar2, NAME_IN varchar2) 
    return varchar2 
    IS 
    where_stmt varchar2(5000); 
    BEGIN 

     if schema_in='VPD674' and NAME_IN='MSGG_GUIDES' THEN 
     where_stmt := 'PERSON_ID = MSGG_SESSION.get_user_id'; 

     elsif schema_in='VPD674' and NAME_IN='MSGG_ORDERS' THEN 
     where_stmt := 'ORDERING_PERSON = MSGG_SESSION.get_user_id'; 

     elsif schema_in='VPD674' and NAME_IN='MSGG_SIGHTING_REPORTS' THEN 
     where_stmt := 'PERSON_ID = MSGG_SESSION.get_user_id'; 

     elsif schema_in='VPD674' and NAME_IN='MSGG_TRIP_HISTORY' THEN 
     where_stmt := 'GUIDE_ID = MSGG_SESSION.get_user_id'; 

     end if; 

    return (where_stmt); 

    end MSGG_SECURITY_POLICY; 

FUNCTION MSGG_SECURITY_POLICY_G( 
    schema_var IN VARCHAR2, 
    table_var IN VARCHAR2 
) 
RETURN VARCHAR2 
IS 
    return_val VARCHAR2 (400); 
BEGIN 
    return_val := 'PERSON_ID = ''14'''; 
    RETURN return_val; 
END MSGG_SECURITY_POLICY_G; 

end MSGG_SESSION; 

/

cevap

1

Gelecek olan kişi için bunu anlayabildim. ADD_POLICY'yi yapılandırdığım yol doğru değildi. Policy_function parametresindeki işlevi içeren paket adını eklemem gerekiyordu. İşte düzeltilmiş versiyon. İşlev isminden önce MSGG_SESSION eklediğimi göreceksiniz.

BEGIN 
DBMS_RLS.ADD_POLICY(
    object_schema => 'VPD674', 
    object_name => 'MSGG_GUIDES', 
    policy_name => 'MSGG_SECURITY_POLICY1', 
    function_schema => 'VPD674', 
    policy_function => 'MSGG_SESSION.MSGG_SECURITY_POLICY', 
    statement_types => 'SELECT'); 
END; 
/
İlgili konular