Oracle

Oracle Text 所需的權限

  • July 2, 2020

我是 Oracle Text 的新手,我正在使用它來支持我編寫的應用程序中的搜尋功能。一切似乎都正常工作,除了我對必須在 ctxsys 模式中儲存一堆東西以解決權限不足問題這一事實不滿意。(這適用於 Oracle 10gR2)。

這是我必須為我的應用程序設置 Oracle Text 的 SQL 腳本

-- Since the CTXSYS schema was created when Oracle Text was installed
-- it does not yet have permission to select on certain tables it needs to
-- for the below procedure
grant select on dmg.table1 to CTXSYS;
grant select on dmg.table2 to CTXSYS;
grant select on dmg.table3 to CTXSYS;
grant select on dmg.table4 to CTXSYS;
grant select on dmg.table5 to CTXSYS;

create or replace procedure ctxsys.attr_indexing_procedure (
   rid  in              rowid,
   tlob in out NOCOPY   clob )
is


begin
   -- This procedure queries the above five tables to extract text and combine it into a single document placed into tlob
end;
/

begin
   ctx_ddl.create_preference('dmg.my_datastore', 'user_datastore' );

   ctx_ddl.set_attribute( 'dmg.my_datastore', 'procedure', 'CTXSYS.attr_indexing_procedure' );
end;
/

begin
   ctx_ddl.create_preference( 'dmg.my_index_lexer', 'BASIC_LEXER' );
   ctx_ddl.set_attribute( 'dmg.my_index_lexer', 'base_letter', 'YES');
end;
/

begin 
 ctx_ddl.create_preference('dmg.MY_STEM_FUZZY_PREF', 'BASIC_WORDLIST'); 
 ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','STEMMER','ENGLISH');
 ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','FUZZY_MATCH','ENGLISH');
 ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','FUZZY_SCORE','0');
 ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','FUZZY_NUMRESULTS','5000');
 ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','SUBSTRING_INDEX','TRUE');
 ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','PREFIX_INDEX','TRUE');
 ctx_ddl.set_attribute('dmg.MY_STEM_FUZZY_PREF','WILDCARD_MAXTERMS','5000');
end;
/

-- I would prefer that this index be owned by dmg but it looks like that would require the create any table privilege on dmg (because oracle text
-- will create tables in the ctxsys schema when creating the index). Therefore, ctxsys will own the text index.
create index ctxsys.ix_doi_attr on table1(column1) indextype is ctxsys.context parameters( 'datastore dmg.my_datastore lexer dmg.my_index_lexer wordlist dmg.DOI_STEM_FUZZY_PREF');

-- Schedule the index to sync every 4 hours
declare
 job_num number;
 nlsvar varchar2(4000);
 envvar raw(32);
begin
 select nls_env,misc_env into nlsvar,envvar from dba_jobs where rownum<2 and nls_env is not null and misc_env is not null;
 select max(job)+1 into job_num from dba_jobs;
 sys.dbms_ijob.submit(job=>job_num, luser=>'CTXSYS', puser=>'CTXSYS', cuser=>'CTXSYS', what=>'ctx_ddl.sync_index(''ctxsys.ix_doi_attr'');', next_date=>sysdate+1/1440,
                 interval=>'SYSDATE+240/1440', broken=>false, nlsenv=>nlsvar, env=>envvar);
 commit;
 dbms_output.put_line('job '||job_num||' has been submitted.');
end;
/

此腳本旨在由我的個人使用者執行,該使用者具有 DBA 角色。所有相關表都歸“DMG”模式所有,它的權限非常有限。

如您所見,我正在使用 user_datastore 將多個表中的文本聚合到一個文件中。此外,如果索引過程、索引本身和定期同步索引的 dmbs_job 都歸 ctxsys 所有,我只能完成這項工作,這似乎是個壞主意。最好,我希望所有東西都歸 DMG 模式所有。

我遇到的最大問題是在創建索引語句中。它總是會失敗

SQL Error: ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-50857: oracle error in drvxtab.create_index_tables
ORA-01031: insufficient privileges
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 364
29855. 00000 -  "error occurred in the execution of ODCIINDEXCREATE routine"
*Cause:    Failed to successfully execute the ODCIIndexCreate routine.
*Action:   Check to see if the routine has been coded correctly.

DR$IX_DOI_ATTR$I經過一番探勘,我發現 create index 語句試圖在名為、DR$IX_DOI_ATTR$KDR$IX_DOI_ATTR$NDR$IX_DOI_ATTR$P和的 ctxsys 模式下創建一些表DR$IX_DOI_ATTR$R。我發現如果我賦予 DMG 模式CREATE ANY TABLE特權,它可以創建索引,但這不是我想要在生產中做的事情。

我怎樣才能讓 DMG 架構擁有所有東西(即我需要授予 DMG 架構的最低權限)?有沒有辦法讓我刪除 dmg 表上對 ctxsys 的授權?

編輯:

我最初說賦予 DMG 模式CREATE ANY TABLE特權有效是不正確的。而是將錯誤消息更改為:

SQL Error: ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-50857: oracle error in drvxtab.create_index_tables
ORA-01536: space quota exceeded for tablespace 'DMG'
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 364
29855. 00000 -  "error occurred in the execution of ODCIINDEXCREATE routine"
*Cause:    Failed to successfully execute the ODCIIndexCreate routine.
*Action:   Check to see if the routine has been coded correctly.

這是一條非常奇怪的消息,因為在該數據庫的任何地方都沒有設置配額。我不知道它是如何達到配額限制的。

我最終做的是在創建索引之前授予 DMG 模式 DBA 訪問權限,然後立即撤銷它。我擔心這會導致索引無法同步,但它似乎工作得很好。我能夠將所有內容移入 DMG 架構 = 並刪除對 ctxsys 架構的初始授權。

我仍然不清楚我需要哪些特定權限來授予 DMG 架構,但我解決了我的問題。

上下文表是在使用者中使用 PL/SQL 包創建的。

您需要授予create table使用者,並為使用者的預設表空間配額。

無需 DBA,只需執行

select 'alter user ' || USERNAME || 
      ' quota unlimited on ' || DEFAULT_TABLESPACE ||';' 
from dba_users where USERNAME = 'DMG';

上述 SQL 將生成 SQL 以在使用者的預設表空間上授予無限配額。執行輸出,然後確保使用者有create table權限,比如

grant create table to DMG;

引用自:https://dba.stackexchange.com/questions/33923