2016-09-07 6 views
0

У меня есть миграция данных, и я просил проверить некоторые имена таблиц, у меня нет разрешений DBA, и представление USER_TABLE не полезно, потому что таблицы принадлежат другому пользователю. Так что моя идея состоит в том, чтобы сделать аа запрос следующим образом (я использую разработчик Oracle SQL):Проверить имена других пользователей

CREATE GLOBAL TEMPORARY TABLE table_exist (NAME VARCHAR(50), EXIST VARCHAR(15)) 
ON COMMIT DELETE ROWS 
/
DECLARE 
v_exist number; 

BEGIN 
SELECT (1) INTO v_exist FROM SCHEMA.TABLE WHERE ROWNUM =1; 
INSERT INTO table_exist (NAME, EXIST) 
VALUES ('TABLE','EXIST'); 

EXCEPTION 
WHEN OTHERS THEN 
INSERT INTO table_exist (NAME, EXIST) 
VALUES ('TABLE','NOT_EXIST'); 
END; 
/
SELECT * FROM table_exist; 
/
DROP TABLE table_exist; 

Вопрос заключается в том, что, когда таблица не существует SQL игнорировать блок исключений здесь есть ошибка, я получаю:

Informe de error - 
ORA-06550: línea 5, columna 55: 
PL/SQL: ORA-00942: la tabla o vista no existe 
ORA-06550: línea 5, columna 3: 
PL/SQL: SQL Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

no se ha seleccionado ninguna fila 



Table TABLE_EXIST borrado. 

Можете ли вы рассказать мне, почему я получаю эту ошибку и почему sql не читает блок исключений? (у меня не слишком много опыта в sql oracle).

Thaks, я надеюсь, вы можете мне помочь.

+0

Это ошибка компиляции и не будет исключена. Если вы хотите попробовать этот подход, вам понадобится динамический sql. Ищите 'execute немедленный' – vercelli

+0

Забудьте об этом, этот подход не сработает, так как вы не узнаете, существует ли таблица, или у вас нет доступа к ней. Если у вас есть доступ к нему с вашим пользователем, попробуйте запросить 'select owner, table_name from all_tables, где owner = 'theOtherSchema';' – vercelli

+1

vercelli, много работает! – Abianco

ответ

1

Существует три версии различных видов каталога: DBA_, USER_ и ALL_. Что вам нужно для запроса: ALL_TABLES (не USER_TABLES, который показывает только ваши собственные таблицы, а не DBA_TABLES, так как у вас нет полномочий DBA). ALL_TABLES покажет вам все таблицы, на которые вам было предоставлено разрешение на просмотр, в том числе от других пользователей.

Возможно, некоторые из таблиц, которые вам «нужны», чтобы увидеть вас, не смогут увидеть, потому что у вас нет необходимых разрешений. Это будет признаком того, что существует несоответствие между тем, что вы просили, и полномочиями, которые вы получили; не будет «технологического» пути вокруг него, это станет проблемой для бизнеса.

+0

Ty много !! я делаю это с помощью select owner, table_name из all_tables, и он работает! – Abianco

Смежные вопросы