Динамическое переименование индексов и ограничений с помощью скрипта - PullRequest
1 голос
/ 15 марта 2019

У меня есть некоторые безымянные ограничения на таблицу, которые начинаются с SYS_.Я хочу назвать их условно с помощью TABLENAME_CONSTRAINTTYPE, например вместо SYS_C12345 Я хочу назвать его MyTable1_PK

Теперь проблема заключается в том, что мне нужно сделать это в нескольких средах и с именем ограниченияотличается от окружающей среды к окружающей среде.Поэтому я ничего не могу жестко запрограммировать, поскольку один и тот же сценарий будет запускаться во всех средах.

Я нашел способ динамического получения имени ограничения на основе имени столбца и типа ограничения:

SELECT acc.CONSTRAINT_NAME
FROM   ALL_CONS_COLUMNS acc
   INNER JOIN ALL_CONSTRAINTS ac
   ON ( acc.CONSTRAINT_NAME = ac.CONSTRAINT_NAME )
WHERE  ac.OWNER        = 'SCHEMA1'
AND    ac.TABLE_NAME   = 'MY_TABLE1'
AND    acc.COLUMN_NAME = 'MY_ID'
AND    ac.CONSTRAINT_TYPE IN ('P') 
AND acc.CONSTRAINT_NAME LIKE 'SYS_%'

но у меня проблемы с интеграцией с переименованием sql:

ALTER TABLE SCHEMA1.MY_TABLE1 RENAME CONSTRAINT '' TO MY_TABLE1_PK;

Может кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вы можете использовать execute immediate в блоке кода PL / SQL внутри цикла, как показано ниже

begin
  for c in (
            SELECT acc.CONSTRAINT_NAME, ac.TABLE_NAME, ac.OWNER
              FROM   ALL_CONS_COLUMNS acc
             INNER JOIN ALL_CONSTRAINTS ac
                ON ( acc.CONSTRAINT_NAME = ac.CONSTRAINT_NAME )
             WHERE  ac.OWNER        = 'SCHEMA1'
               AND  ac.TABLE_NAME   = 'MY_TABLE1'
               AND  acc.COLUMN_NAME = 'MY_ID'
               AND  ac.CONSTRAINT_TYPE IN ('P') 
               AND acc.CONSTRAINT_NAME LIKE 'SYS_%'
            )
  loop
    execute immediate 'ALTER TABLE '||c.OWNER||'.'||c.TABLE_NAME||' RENAME CONSTRAINT 
                      '||c.CONSTRAINT_NAME||' TO '||c.TABLE_NAME||'_pk';
  end loop;
end;
0 голосов
/ 15 марта 2019

Вы можете создать SP и вызывать его с правильными параметрами.

create or replace PROCEDURE sp_update_constraints(p_schema_name IN VARCHAR2,
                                              p_table_name  IN VARCHAR2,
                                              p_column_name IN VARCHAR2) IS
CURSOR constraint_name_cur(p_schema_name VARCHAR2,
                           p_table_name  VARCHAR2,
                           p_column_name VARCHAR2) IS
    SELECT acc.CONSTRAINT_NAME
    FROM   ALL_CONS_COLUMNS acc
       INNER JOIN ALL_CONSTRAINTS ac
       ON ( acc.CONSTRAINT_NAME = ac.CONSTRAINT_NAME )
    WHERE  ac.OWNER        = p_schema_name
    AND    ac.TABLE_NAME   = p_table_name
    AND    acc.COLUMN_NAME = p_column_name
    AND    ac.CONSTRAINT_TYPE IN ('P') 
    AND acc.CONSTRAINT_NAME LIKE 'SYS_%';
BEGIN
FOR cn IN constraint_name_cur(p_schema_name, p_table_name, p_column_name) LOOP
    DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || p_schema_name || '.' || p_table_name || ' RENAME CONSTRAINT ' || cn.constraint_name || ' TO ' || p_table_name ||'_PK');
    EXECUTE IMMEDIATE 'ALTER TABLE ' || p_schema_name || '.' || p_table_name || ' RENAME CONSTRAINT ' || cn.constraint_name || ' TO ' || p_table_name ||'_PK';
END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...