Dass Oracle TEXT einen FILE_DATASTORE anbietet, mit dem man Dateien
im lokalen Dateisystem des Datenbankservers indizieren kann, ist den meisten
bekannt. Dazu braucht es (wie immer) eine Tabelle, in der sich nun aber keine
Dokumente, sondern Dokumentpfade befinden, wie folgendes Beispiel zeigt.
create table index_files ( id number(10), path varchar2(500) ) / insert into index_files (id, path) values (1, '/home/oracle/twp_apex_best_practices.pdf') / commit /
Wenn nun ein Textindex auf die Spalte PATH erzeugt wird, ist es klar, dass nicht die
Pfade selbst, sondern die Dateien, die sich hinter dem Pfad befinden, indiziert werden sollen.
Das wird mit der Datastore-Preference FILE_DATASTORE bestimmt. Ein erster Versuch
wird allerdings mit einer Fehlermeldung quittiert.
create index ft_files on index_files (path) indextype is ctxsys.context parameters ( 'filter ctxsys.auto_filter datastore ctxsys.file_datastore ') / create index ft_files on index_files (path) * FEHLER in Zeile 1: ORA-29855: Fehler bei Ausführung der Routine ODCIINDEXCREATE ORA-20000: Oracle Text error: DRG-10758: index owner does not have the privilege to use file or URL datastore ORA-06512: in "CTXSYS.DRUE", Zeile 160 ORA-06512: in "CTXSYS.TEXTINDEXMETHODS", Zeile 366
Diejenigen, die Oracle TEXT schon länger kennen, dürften sich nun wundern; denn "früher"
wäre dieses CREATE INDEX-Kommando fehlerfrei durchgelaufen. Nun fehlt ein Privileg - und
das ist auch gut so - denn über den Umweg des Textindex ließen sich ja
ansonsten große Teile des Filesystems auf dem Datenbankserver auslesen. Also wurde hier
ein zusätzlicher Schutz eingeführt. Der Eigentümer des Oracle-Text-Index braucht
eine zusätzliche Rolle. Der Name dieser Rolle ist vom Oracle TEXT Development allerdings
flexibel gehalten worden (und genau das führt oft zu Konfusion). Im Oracle TEXT
Dictionary wird eine Datenbankrolle als sog. FILE_ACCESS_ROLE registriert. Diese Rolle
muss der Eigentümer des Textindex dann zugewiesen bekommen.
- Also legen wir zunächst eine Rolle an, welche die FILE_ACCESS_ROLE sein soll. Das
geschieht als DBA.
SYS@[sccloud033:1521/orcl] SQL> create role text_dateizugriff not identified; Rolle wurde erstellt.
-
Dann legen wir diese Rolle (hier also TEXT_DATEIZUGRIFF) als die FILE_ACCESS_ROLE für Oracle TEXT fest.
SYS@[sccloud033:1521/orcl] SQL> begin 2 ctxsys.ctx_adm.0set_parameter ('FILE_ACCESS_ROLE', 'TEXT_DATEIZUGRIFF'); 3 end; 4 / PL/SQL-Prozedur erfolgreich abgeschlossen.
-
Schließlich wird die Rolle TEXT_DATEIZUGRIFF dem Datenbankschema zugewiesen, welches den
Textindex erzeugen möchte, also SCOTT oder wie hier: TESTIT.
SYS@[sccloud033:1521/orcl] SQL> grant text_dateizugriff to testit; Benutzerzugriff (Grant) wurde erteilt.
Versucht der User TESTIT nun nochmals, den Index mit CREATE INDEX zu bauen, so wird
er nun erfolgreich sein.
SQL> create index ft_files on index_files (path) 2 indextype is ctxsys.context 3 parameters ( 4 'filter ctxsys.auto_filter 5 datastore ctxsys.file_datastore 6 ') 7 / Index wurde erstellt. SQL> select * from index_files where contains(path, 'application express') > 0 / ID PATH ---------- -------------------------------------------------- 1 /home/oracle/twp_apex_best_practices.pdf
Also alles ganz einfach. Zusammengefasst kann man sagen:
- Möchte man mit Oracle TEXT den FILE_DATASTORE verwenden, um Inhalte des lokalen Dateisystems zu indizieren, so braucht der Datenbankuser eine zusätzliche Rolle.
- Diese Rolle heißt nicht FILE_ACCESS_ROLE - vielmehr muss man (als DBA) eine eigene Rolle (mit eigenem Namen) erzeugen, diese als FILE_ACCESS_ROLE im Oracle TEXT Dictionary registrieren und dem Datenbankschema zuweisen.
Das ist auch in der Oracle TEXT Dokumentation - im Abschnitt FILE_DATASTORE and Security beschrieben.