powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер AFTER RENAME
10 сообщений из 10, страница 1 из 1
Триггер AFTER RENAME
    #34904886
question9.2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
В случае rename таблиц нужно сделать кое-какие изменения в базе. Для этого нужно знать старое и новое значение таблицы. Проблема в том, что в аттрибутах AFTER RENAME триггера есть только один атрибут на эту тему - ora_dict_obj_name, он возвращает старое название таблицы. Подскажите - можно ли как-то узнать новое название таблицы в AFTER RENAME триггере???
Oracle 9.2.
Спасибо.
...
Рейтинг: 0 / 0
Триггер AFTER RENAME
    #34905002
Фотография ДВК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По мотивам вот этих примеров .

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
SQL> CREATE TABLE ddl_log (SQL_TEXT varchar( 255 ));

Table created

SQL> CREATE OR REPLACE TRIGGER ddl_trig
   2     BEFORE RENAME ON SCHEMA
   3   declare
   4     sql_Text ora_name_list_t;
   5     i        PLS_INTEGER;
   6   BEGIN
   7   
   8     i := sql_txt(sql_text);
   9   
  10     INSERT INTO ddl_log (sql_text) VALUES (sql_text( 1 ));
  11   END ddl_trig;
  12   /

Trigger created

SQL> create table old_name(id integer);

Table created

SQL> rename old_name to new_name;

Table renamed

SQL> select * from ddl_log;

SQL_TEXT
--------------------------------------------------------------------------------
rename old_name to new_name

А дальше в триггере анализируйте строку sql_text(1).
...
Рейтинг: 0 / 0
Триггер AFTER RENAME
    #34905139
question9.2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДВК, спасибо !
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Триггер AFTER RENAME
    #39987820
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер всем!
А можно в таком случае получить штатными средствами новое имя таблицы в oracle 11? Или лучше использовать регэксп, который выбирает последнее слово из sql_text(1)?
...
Рейтинг: 0 / 0
Триггер AFTER RENAME
    #39987830
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовала этот как я понимаю хак. Работает. А штатные средства есть? Как :old и :new?
...
Рейтинг: 0 / 0
Триггер AFTER RENAME
    #39987840
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnnitaBells
Работает.


А умный гору обойдет и выполнит ALTER TABLE ... RENAME TO ...;

SY.
...
Рейтинг: 0 / 0
Триггер AFTER RENAME
    #39987854
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AnnitaBells,

Object_id не меняется
...
Рейтинг: 0 / 0
Триггер AFTER RENAME
    #39987859
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender

Object_id не меняется


Но к сожалению Oracle не имеет attribute function ora_dict_obj_id, так-что придется лепить что-то типа:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
DROP PACKAGE PKG
/
CREATE OR REPLACE
  PACKAGE PKG
    IS
      V_OBJECT_ID NUMBER;
END;
/
CREATE OR REPLACE
  TRIGGER BEFORE_RENAME
  BEFORE RENAME
  ON DATABASE
  DECLARE
  BEGIN
      SELECT  OBJECT_ID
        INTO  PKG.V_OBJECT_ID
        FROM  DBA_OBJECTS
        WHERE OWNER = ora_dict_obj_owner
          AND OBJECT_NAME = ora_dict_obj_name;
      DBMS_OUTPUT.PUT_LINE('OLD_NAME: ' || ora_dict_obj_name);
END;
/
CREATE OR REPLACE
  TRIGGER AFTER_RENAME
  AFTER RENAME
  ON DATABASE
  DECLARE
      V_OBJECT_NAME VARCHAR2(128);
  BEGIN
      SELECT  OBJECT_NAME
        INTO  V_OBJECT_NAME
        FROM  DBA_OBJECTS
        WHERE OBJECT_ID = PKG.V_OBJECT_ID;
      DBMS_OUTPUT.PUT_LINE('NEW_NAME: ' || V_OBJECT_NAME);
END;
/



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> CREATE TABLE TBL_OLD(N NUMBER);

Table created.

SQL> SET SERVEROUTPUT ON
SQL> RENAME TBL_OLD TO TBL_NEW;
OLD_NAME: TBL_OLD
NEW_NAME: TBL_NEW

Table renamed.

SQL>



Ну и, как я уже намекал AnnitaBells переименовать можно и через ALTER TABLE ... RENAME TO ...; Так-что придется писать еще два триггера и все равно придется парсить ALTER.

SY.
...
Рейтинг: 0 / 0
Триггер AFTER RENAME
    #39987863
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
AnnitaBells
Работает.


А умный гору обойдет и выполнит ALTER TABLE ... RENAME TO ...;

SY.


Учла. Сделала регулярное выражение и для этого случая. Спасибо!
...
Рейтинг: 0 / 0
Триггер AFTER RENAME
    #39987876
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

имхо создавать пакет для переменной, лучше в контекстную переменную сохранить:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
CREATE OR REPLACE
  TRIGGER BEFORE_RENAME
  BEFORE RENAME
  ON DATABASE
  DECLARE
    V_OBJECT_ID ALL_OBJECTS.OBJECT_ID%type;
  BEGIN
      SELECT  OBJECT_ID
        into V_OBJECT_ID
        FROM  ALL_OBJECTS
        WHERE OWNER = ora_dict_obj_owner
          AND OBJECT_TYPE = ora_dict_obj_type
          AND OBJECT_NAME = ora_dict_obj_name;
      dbms_session.set_context('clientcontext','OBJECT_ID',V_OBJECT_ID);
      DBMS_OUTPUT.PUT_LINE('OLD_NAME: ' || ora_dict_obj_name);
END;
/
CREATE OR REPLACE
  TRIGGER AFTER_RENAME
  AFTER RENAME
  ON DATABASE
  DECLARE
      V_OBJECT_NAME ALL_OBJECTS.OBJECT_NAME%type;
  BEGIN
      SELECT  OBJECT_NAME
        INTO  V_OBJECT_NAME
        FROM  ALL_OBJECTS o
        WHERE o.OBJECT_ID = sys_context('clientcontext','OBJECT_ID');
      DBMS_OUTPUT.PUT_LINE('NEW_NAME: ' || V_OBJECT_NAME);
END;
/
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер AFTER RENAME
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]