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

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


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

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

Object_id не меняется
...
Рейтинг: 0 / 0
09.08.2020, 00:24
    #39987859
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер AFTER RENAME
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
09.08.2020, 00:46
    #39987863
AnnitaBells
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер AFTER RENAME
SY
AnnitaBells
Работает.


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

SY.


Учла. Сделала регулярное выражение и для этого случая. Спасибо!
...
Рейтинг: 0 / 0
09.08.2020, 04:13
    #39987876
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер AFTER RENAME
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер AFTER RENAME / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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