Нет соответствующего уникального или первичного ключа для этого списка столбцов при запросе таблицы user_index - PullRequest
0 голосов
/ 18 мая 2018
SELECT DISTINCT(UI.TABLE_NAME)
    ,UI_INDEX_NAME
FROM USER_INDEXES UI
INNER JOIN USER_TABLES UT ON UT_TABLE_NAME = UI.TABLE_NAME
INNER JOIN TMP ON TMP.TABLE_NAME = UI.TABLE_NAME
INNER JOIN USER_CONS_COLUMNS UC ON UC.TABLE_NAME = UI.TABLE_NAME
WHERE UT.IOT_TYPE IS NULL
    AND UC.COLUMN_NAME IN (
        'STAFF_ID'
        ,'STAFF_UNIQUE_ID'
        )
    AND UC.TABLE_NAME LIKE 'HR_%'
    OR UC.TABLE_NAME = 'PAYROLL';

Над таблицей запросить список индексов, ссылающихся на таблицу, имеющую PK как staff_id или staff_unique_id из имени таблицы PAYROLL и HR_*.TMP - это таблица, в которой хранится список имен таблиц, так как я не хочу, чтобы он просматривал все USER_TABLE или USER_INDEX.

У меня нет проблем при ручном выборе, однако обнаружена ошибка:

ORA-02270: нет соответствующего уникального или первичного ключа для этого списка столбцов

в PL / SQL при выборе результата и выполнении INDEX REBULD

Результат возврата кажется неверным, многие избыточные INDEX_NAME указывают на одну и ту же таблицу.Я положил DISTINCT для UI.TABLE_NAME, чтобы решить дубликат.Но в PLSQL мне не нужно заполнять UI.TABLE_NAME, так как может появиться ошибка?

--index rebuild
FOR r IN (....) LOOP
   l_sql := 'ALTER INDEX '||r.index_name||' REBUILD';   
   EXECUTE IMMEDIATE l_sql; 
END LOOP;

--disable constraint
FOR m IN (SELECT UC.CONSTRAINT_NAME ,UC.TABLE_NAME FROM USER_CONSTRAINTS UC
          INNER JOIN TMP ON UC.TABLE_NAME = TMP.TABLE_NAME
          WHERE UC.TABLE_NAME = TMP.TABLE_NAME AND UC.CONSTRAINT_TYPE IN 
          ('R', 'C', 'U') AND UC.TABLE_NAME LIKE 'HR_%' OR UC.TABLE_NAME = 
          'PAYROLL') LOOP
     l_sql := 'ALTER TABLE '||m.TABLE_NAME||' DISABLE CONSTRAINT 
              '||m.CONSTRAINT_NAME||' CASCADE';
    EXECUTE IMMEDIATE l_sql; 
END LOOP;

--enable constraint
 FOR n IN (SELECT UC.CONSTRAINT_NAME ,UC.TABLE_NAME FROM USER_CONSTRAINTS UC
          INNER JOIN TMP ON UC.TABLE_NAME = TMP.TABLE_NAME
          WHERE UC.TABLE_NAME = TMP.TABLE_NAME AND UC.CONSTRAINT_TYPE IN 
          ('R', 'C', 'U') AND UC.TABLE_NAME LIKE 'HR_%' OR UC.TABLE_NAME = 
          'PAYROLL') LOOP
    l_sql := 'ALTER TABLE '||n.TABLE_NAME||' ENABLE CONSTRAINT 
             '||n.CONSTRAINT_NAME||'';
   EXECUTE IMMEDIATE l_sql; 
   END LOOP;
...