Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Изменить тело в процедурах / 21 сообщений из 21, страница 1 из 1
06.10.2017, 04:05
    #39531893
JohnyCage
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
Коллеги, приветствую!
Просьба подсказать есть ли кого готовые решения или мысли как массово изменить тело процедур?
Задача следующая:
Требуется провести аудит по использованию процедур при формировании отчетов.
В БД насчитывается около 700 процедур для отчетов.
Первое, что пришло в голову это добавить строчку "insert into..." в тело процедуры после begin, но каждую править руками трудозатратно.
Спасибо.
...
Рейтинг: 0 / 0
06.10.2017, 05:04
    #39531897
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
1. Извлечь код нужных процедур в скрипт ([CREATE OR] ALTER PROCEDURE).
2. Обработать полученный скрипт, вставив что положено куда следует.
3. Накатить скрипт на базу.
...
Рейтинг: 0 / 0
06.10.2017, 06:04
    #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
06.10.2017, 06:35
    #39531904
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
JohnyCageТребуется провести аудит по использованию процедур при формировании отчетов.
В БД насчитывается около 700 процедур для отчетов.
Первое, что пришло в голову это добавить строчку "insert into..." в тело процедуры после begin, но каждую править руками трудозатратно.
Спасибо.

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

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

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


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

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

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

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

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

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

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

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

да ладно, а как же MON$CALL_STACK
...
Рейтинг: 0 / 0
07.10.2017, 19:22
    #39532756
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
vvvaitда ладно, а как же MON$CALL_STACK
К сожалению это не очень работоспособно.
...
Рейтинг: 0 / 0
08.10.2017, 03:11
    #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
08.10.2017, 09:55
    #39532873
Roman Simakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
Dimitry SibiryakovJohnyCageТребуется провести аудит по использованию процедур при формировании отчетов.

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


Именно! Странно что больше никто не пишет и все изобретают костыли. Изучайте трейс. Это сильная штука.
...
Рейтинг: 0 / 0
08.10.2017, 14:46
    #39532930
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
vvvaitafgm, отнюдь
А теперь потестим это на... не самой экстремальной нагрузке.
...
Рейтинг: 0 / 0
08.10.2017, 15:02
    #39532935
vvvait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
afgm, ну не знаю, лишних 0,5 - 1 мс это критично? может на куче коннектов будет похуже надо пробовать.
...
Рейтинг: 0 / 0
08.10.2017, 19:28
    #39533039
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
vvvaitafgm, ну не знаю, лишних 0,5 - 1 мс это критично? может на куче коннектов будет похуже надо пробовать.
Для сложных обработок, где вызывается много процедур оверхед буде очень ощутимый.
Да и количество транзакция будет увеличиваться многократно, что может быть даже больнее.
...
Рейтинг: 0 / 0
08.10.2017, 19:41
    #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
08.10.2017, 21:32
    #39533073
vvvait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
afgm, ну это и есть 1 мс на вызов
...
Рейтинг: 0 / 0
08.10.2017, 21:52
    #39533081
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить тело в процедурах
vvvaitafgm, ну это и есть 1 мс на вызов
Завит от нагрузки.
Снэпшот мониторинговых таблиц с высокой частотой - дорого
Пачка лишних транзакций - дорого
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Изменить тело в процедурах / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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