powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Изменить тело в процедурах
21 сообщений из 21, страница 1 из 1
Изменить тело в процедурах
    #39531893
JohnyCage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, приветствую!
Просьба подсказать есть ли кого готовые решения или мысли как массово изменить тело процедур?
Задача следующая:
Требуется провести аудит по использованию процедур при формировании отчетов.
В БД насчитывается около 700 процедур для отчетов.
Первое, что пришло в голову это добавить строчку "insert into..." в тело процедуры после begin, но каждую править руками трудозатратно.
Спасибо.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39531897
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Извлечь код нужных процедур в скрипт ([CREATE OR] ALTER PROCEDURE).
2. Обработать полученный скрипт, вставив что положено куда следует.
3. Накатить скрипт на базу.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39531900
JohnyCage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,

Александр, спасибо. Выполнил извлечение метаданных в IBExpert, но часть процедур экспортировались со следующим видом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE OR ALTER PROCEDURE RPT_PROC (
    FIELD1 INTEGER,
    FIELD2 INTEGER,
    FIELD3 DATE,
    FIELD4 DATE,
    FIELD5 DATE,
    FIELD6 DATE,
    FIELD7 INTEGER,
    FIELD8 INTEGER,
    FIELD9 INTEGER,
    FIELD10 INTEGER)
RETURNS (
    R_FIELD1 VARCHAR(30),
    R_FIELD2 VARCHAR(255),
    R_FIELD3 DOUBLE PRECISION,
    R_FIELD4 DOUBLE PRECISION,
    R_FIELD5 VARCHAR(30))
AS
BEGIN
  SUSPEND;
END;



Хотя в самой процедуре есть обработка данных.

Настройки в IBE


...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39531904
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnyCageТребуется провести аудит по использованию процедур при формировании отчетов.
В БД насчитывается около 700 процедур для отчетов.
Первое, что пришло в голову это добавить строчку "insert into..." в тело процедуры после begin, но каждую править руками трудозатратно.
Спасибо.

Что бы потом не править обратно, я бы вызывал не "insert into" а процедуру логирования, передавал бы в нее параметры, типа имя процедуры из которой вызывалось логирование. Тогда в процедуре логирования можно и данные перепихивать в разные места, если потребуется, и включать/выключать логирование на основании состояния генератора/переменной/записи в таблице.

Нужно - включил, не нужно - выключил. И это прямо на работающей базе, не меняя метаданных и управление сконцентрировано в одном месте.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39531907
JohnyCage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

Точно. Спасибо, так действительно будет лучше и удобнее.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39531911
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnyCageВыполнил извлечение метаданных в IBExpert, но часть процедур экспортировались со следующим видом:


Это заглушки для разруливания зависимостей. Ищи ниже полные определения - они там есть. Вот эту часть нужно выделить и обработать.

А если сервер позволяет модифицировать системные таблицы напрямую, то можно просто пробежаться по RDB$PROCEDURES, вытащить RDB$PROCEDURE_SOURCE каждой нужной процедуры, найти в нем первый begin, вставить после него необходимое и апдейтить RDB$PROCEDURE_SOURCE. Затем просто перекомпилировать все процедуры и получить рабочий скрипт.
Разумеется, делать это нужно не на рабочей базе.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39531916
JohnyCage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,

Спасибо. Буду пробовать.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39531999
JohnyCage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,

А случайно не подскажете как получить имя выполняемой процедуры? информации чего-то не нашел...
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39532061
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хех, а я-то по названию темы подумал, что она о косметических процедурах для похудания )))

+ за отдельную процедуру лога

Изнутри процедуры получить ее имя никак нельзя, придется задавать константой
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39532089
JohnyCage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Василий №2,

Так и думал. Благодарю. Буду тогда использовать совет Александра. (RDB$PROCEDURES)
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39532097
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnyCageТребуется провести аудит по использованию процедур при формировании отчетов.

Для этого не требуется изменять тела процедур. Достаточно включить аудит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39532585
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Василий №2Изнутри процедуры получить ее имя никак нельзя, придется задавать константой

да ладно, а как же MON$CALL_STACK
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39532756
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvaitда ладно, а как же MON$CALL_STACK
К сожалению это не очень работоспособно.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39532852
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
afgm, отнюдь

Код: sql
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.
37.
38.
39.
40.
41.
42.
create or alter procedure SET_CALLER_NAME
as
declare variable NM varchar(100);
declare variable TR integer;
begin
  TR = current_transaction;
  in autonomous transaction
  do select cs.MON$OBJECT_NAME
     from MON$CALL_STACK cs
     where exists(select *
            from MON$CALL_STACK cs1
            join MON$STATEMENTS s on s.MON$STATEMENT_ID = cs1.MON$STATEMENT_ID and s.MON$STATE = 1
            where s.MON$TRANSACTION_ID = :TR
              and upper(cs1.MON$OBJECT_NAME) = 'SET_CALLER_NAME'
              and cs1.MON$CALLER_ID = cs.MON$CALL_ID)
     into :NM;
  RDB$SET_CONTEXT('USER_TRANSACTION', 'CALLER_NAME', :NM);
end

create or alter procedure TEST_A
returns (NM varchar(100))
as
begin
  execute procedure SET_CALLER_NAME;
  NM = RDB$GET_CONTEXT('USER_TRANSACTION', 'CALLER_NAME');
  RDB$SET_CONTEXT('USER_TRANSACTION', 'CALLER_NAME', null);
  suspend;
end

create or alter procedure TEST_B
returns (NM varchar(100))
as
begin
  execute procedure SET_CALLER_NAME;
  NM = RDB$GET_CONTEXT('USER_TRANSACTION', 'CALLER_NAME');
  RDB$SET_CONTEXT('USER_TRANSACTION', 'CALLER_NAME', null);
  suspend;
end

select TEST_B.NM, TEST_A.NM
from TEST_B
join TEST_A on 0 = 0
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39532873
Roman Simakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovJohnyCageТребуется провести аудит по использованию процедур при формировании отчетов.

Для этого не требуется изменять тела процедур. Достаточно включить аудит.


Именно! Странно что больше никто не пишет и все изобретают костыли. Изучайте трейс. Это сильная штука.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39532930
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvaitafgm, отнюдь
А теперь потестим это на... не самой экстремальной нагрузке.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39532935
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
afgm, ну не знаю, лишних 0,5 - 1 мс это критично? может на куче коннектов будет похуже надо пробовать.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39533039
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvaitafgm, ну не знаю, лишних 0,5 - 1 мс это критично? может на куче коннектов будет похуже надо пробовать.
Для сложных обработок, где вызывается много процедур оверхед буде очень ощутимый.
Да и количество транзакция будет увеличиваться многократно, что может быть даже больнее.
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39533044
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvait,
а вот и пример, показывающий, что многих коннектов не надо

Код: sql
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.
37.
38.
39.
40.
41.
-- Простая таблица
CREATE TABLE TEST_DATA_TABLE (
    ID       INTEGER,
    CAPTION  VARCHAR(50)
);

-- С триггером на вставку
CREATE OR ALTER TRIGGER TEST_DATA_TABLE_BI FOR TEST_DATA_TABLE
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_test_data_table_id,1);
end

-- Вставляем такой процедуркой
create or alter procedure TEST_DATA_TABLE_INS (
    CAPTION varchar(50))
as
begin
  insert into TEST_DATA_TABLE (CAPTION)
  values (:CAPTION);
end

-- Сам код вставки
execute block as
declare variable n int = 10000;
begin
 while (n>0) do
 begin
    execute procedure test_data_table_ins('TEST_CAPTION');
    -- execute procedure SET_CALLER_NAME;
    n = n - 1;
 end
end

/*
ИТОГО:
Без получаения вызыввающего 94ms
С полученим вызывающего     10s 857ms
*/
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39533073
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
afgm, ну это и есть 1 мс на вызов
...
Рейтинг: 0 / 0
Изменить тело в процедурах
    #39533081
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvaitafgm, ну это и есть 1 мс на вызов
Завит от нагрузки.
Снэпшот мониторинговых таблиц с высокой частотой - дорого
Пачка лишних транзакций - дорого
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Изменить тело в процедурах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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