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;
/