процедура в SYSTEM недействительна - PullRequest
0 голосов
/ 16 января 2019

У меня есть успешно скомпилированная процедура в схеме SYSTEM.

create or replace procedure get_file_list as

    ns      varchar2(1024);
    cursor c_my_directory is
        select directory_name, directory_path from all_directories where directory_path like '/home/oracle/EDI%';
begin

    -- before generating the file list, the temporary table is deleted
    delete from edi.temp_EDI_file_list;

    for each_directory in c_my_directory loop
        -- it reads the contents of my_directory into a table called X$FRBMSFT
        sys.dbms_backup_restore.searchfiles (each_directory.directory_path, ns);

        for each_file in (select fname_krbmsft as name from X$KRBMSFT) loop
            insert into edi.temp_edi_file_list
            values (each_directory.directory_name, each_file.name);
        end loop;
    end loop;

    commit;

    exception
        when others then 
            raise_application_error (-20001,sqlcode || ' ' || sqlerrm);

end get_file_list;

[.. она была создана в схеме SYSTEM, потому что мне не разрешено предоставлять выбор в X $ FRBMSFT пользователю "edi"].

Я предоставил права на выполнение пользователю "edi" в этой процедуре.[.. подключен как SYSTEM, роль SYSDBA, я выполнил grant execute on system.get_file_list to EDI;]

Когда я пытаюсь выполнить процедуру (execute system.get_file_list;) с пользователем "edi", возвращается ошибка

PLS-00905: объект SYSTEM.GET_FILE_LIST недействителен

Может кто-нибудь подсказать, что я делаю не так?

Спасибо,

1 Ответ

0 голосов
/ 16 января 2019

В конце концов мне удалось создать процедуру с некоторой помощью по ссылке , предоставленной @ APC.

... соединено как СИСТЕМА

create or replace view file_list as select fname_krbmsft from X$KRBMSFT readonly;

create or replace procedure searchfiles (pattern in out nocopy varchar2, ns in out nocopy varchar2) authid definer as
begin
    dbms_backup_restore.searchfiles(pattern, ns);
end searchfiles;

GRANT SELECT ON FILE_LIST TO EDI;
GRANT EXECUTE ON SEARCHFILES TO EDI;

... обозначено как EDI

create or replace procedure get_file_list as

    ns      varchar2(1024);
    cursor c_my_directory is
        select directory_name, directory_path from all_directories where directory_path like '/home/oracle/EDI%';
begin

    -- before generating the file list, the temporary table is deleted
    delete from edi.temp_EDI_file_list;

    for each_directory in c_my_directory loop
        -- it reads the contents of all directories into a table called X$FRBMSFT via procedure SEARCHFILES
        sys.SEARCHFILES (each_directory.directory_path, ns);

        -- it interogate the X$FRBMSFT via file_list view
        for each_file in (select fname_krbmsft as name from sys.file_list) loop
            insert into temp_edi_file_list
            values (each_directory.directory_name, each_file.name);
        end loop;
    end loop;

    commit;

    exception
        when others then 
            raise_application_error (-20001,sqlcode || ' ' || sqlerrm);

end get_file_list;

Разница была в том, как они назывались объектами, созданными с помощью SYSTEM Они были вызваны с SYS.xxx вместо SYSTEM.xxx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...