Там нет ничего принципиально плохого ваш код. Я могу создать индекс-функции, как это:
SQL> create table promotions (promo_category varchar2(10))
2/
Table created.
SQL> CREATE OR REPLACE FUNCTION promo_function
2 (p_promo_category in VARCHAR2)
3 RETURN VARCHAR2 DETERMINISTIC
4 IS
5 BEGIN
6 RETURN UPPER(p_promo_category);
7 END promo_function;
8/
Function created.
SQL> CREATE INDEX promotions_fbi
2 ON PROMOTIONS (promo_function (promo_category));
Index created.
SQL>
Единственная разница между моим кодом и ваша в том, что я не предварить таблицу в инструкции CREATE INDEX заявление. Все в одной схеме, поэтому мне это не нужно.
Итак, могу ли я воссоздать ваш сценарий? Вот один из способов. Я падение индекса и функции, а затем дать другой использует все привилегии на Teh таблицы ...
SQL> drop index promotions_fbi;
Index dropped.
SQL> drop function PROMO_FUNCTION;
Function dropped.
SQL> grant all on promotions to B;
Grant succeeded.
SQL>
Как пользователь я могу создать нормальный индекс ...
SQL> conn b/b
Connected.
SQL> select * from apc.promotions;
no rows selected
SQL> CREATE INDEX promotions_i
2 ON APC.PROMOTIONS (promo_category);
Index created.
SQL>
Однако, если я создаю функция, которую я не могу создать с помощью индекса на основе функций ....
SQL> conn b/b
Connected.
SQL> CREATE INDEX promotions_fbi
2 ON APC.PROMOTIONS (promo_function (promo_category));
ON APC.PROMOTIONS (promo_function (promo_category))
*
ERROR at line 2:
ORA-00904: : invalid identifier
SQL>
Недействительный идентификатор передает имя функции. Зачем? Потому что, хотя схема B будет владеть индексной схемой, APC владеет таблицей и должна также иметь возможность выполнять эту функцию. Решения о предоставлении права выполнения на функцию к владельцу таблицы:
SQL> conn b/b
Connected.
SQL> grant execute on promo_function to APC;
Grant succeeded.
SQL> CREATE INDEX promotions_fbi
2 ON APC.PROMOTIONS (B.promo_function (promo_category));
Index created.
SQL>
Обратите внимание, что мы должны явно указать владелец функции, а также владелец таблицы в этом заявлении. Это немного неприятно, и поэтому в общем случае это плохая идея распространять привилегии по двум схемам таким образом.
Не знаю, как @zaratustra получает свои выводы, как я могу определенно создать функцию на основе индексов в с помощью функции слов в имени ...
SQL> r
1 select i.table_owner, i.owner as index_owner, i.index_name
2 , i.index_type, e.column_expression
3 from all_indexes i
4 left join all_ind_expressions e
5 on i.owner = e.index_owner
6 and i.index_name = e.index_name
7* where i.table_name = 'PROMOTIONS'
TABLE_OWNER INDEX_OWNER
------------------------------ ------------------------------
INDEX_NAME INDEX_TYPE
------------------------------ ---------------------------
COLUMN_EXPRESSION
--------------------------------------------------------------------------------
APC APC
PROMOTIONS_FBI FUNCTION-BASED NORMAL
"APC"."PROMO_FUNCTION"("PROMO_CATEGORY")
APC A
PROMO_B_I FUNCTION-BASED NORMAL
"A"."B_FUNCTION"("PROMO_CATEGORY")
APC APC
PROMOTIONS_I NORMAL
SQL>
Хотя я на другом выпуске точки так, что могло бы объяснить это
SQL> select banner from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
SQL>
Вы приставкой ссылки таблицы с помощью схемы SH. Кому принадлежит индекс? Кому принадлежит эта функция? – APC
тот же пользователь (назовите его «current_user» или что-то еще) владеет индексом (особенно он будет принадлежать, потому что его еще не существует) и функцией тоже, поэтому я вставил запрос выше, потому что я могу выполнить функцию как «current_user ", но не может создать индекс – Thomas
. Тогда почему вы префикс таблицы refs схемой? Это просто сбивает с толку. Если вы хотите, чтобы люди помогали вам, вам должно быть ясно о вашей ситуации. – APC