私は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を使用して、複数のテーブルのテキストを1つのドキュメントに集約しています。また、インデックス作成手順、インデックス自体、およびインデックスを定期的に同期するdmbs_jobがすべてctxsysによって所有されている場合にのみ、この作業を行うことができました。これは悪い考えのようです。できれば、すべてをDMGスキーマに所有させたいと思います。
私が遭遇した最大の問題は、create indexステートメントでした。それは常に失敗します
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.
少し掘り下げた後、create indexステートメントが、DR$IX_DOI_ATTR$I
、DR$IX_DOI_ATTR$K
、DR$IX_DOI_ATTR$N
、DR$IX_DOI_ATTR$P
、DR$IX_DOI_ATTR$R
と呼ばれるctxsysスキーマの下にいくつかのテーブルを作成しようとしていることがわかりました。 CREATE ANY TABLE
特権を与えれば、DMGスキーマがインデックスを作成できることがわかりましたが、それは私が本番環境でやりたいことではありません。
DMGスキーマが所有するすべてのもの(つまり、DMGスキーマを付与するために必要な最小限の特権)を作成するにはどうすればよいですか? ctxsysへのdmgテーブルの付与を削除する方法はありますか?
編集:
私はもともと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 schema =に移動し、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
privs、次のようなもの
grant create table to DMG;