본질적으로 아무 문제가 없다 당신의 코드. 나는이 같은 함수 기반 인덱스를 만들 수 있습니다
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>
내 코드와 당신 사이의 유일한 차이가 나는 INDEX를 CREATE 문에서 테이블을 앞에 없다는 것입니다. 모든 것이 동일한 스키마에 있으므로 필요하지 않습니다.
그래서 시나리오를 다시 만들 수 있습니까? 한 가지 방법이 있습니다. 내가 만드는 경우 나는, 그러나 ... 나는 일반 인덱스를 만들 수있는 사용자로서
SQL> drop index promotions_fbi;
Index dropped.
SQL> drop function PROMO_FUNCTION;
Function dropped.
SQL> grant all on promotions to B;
Grant succeeded.
SQL>
... 다음 TEH 테이블에 다른 용도로 모든 권한을 부여,
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