Замена отчетов - Продукт Modus BI
отчет, не прерывая его функционирование. Для этого отчет копируется, в копию вносятся изменения, а затем адреса исходного и скопированного отчетов меняются местами с помощью скрипта.
Замена отчета требуется, например, когда необходимо внести изменения в действующийСперва скопируйте отчет и разместите его в специальном разделе, например, «Разработка». Скопированный отчет получает новый адрес.
Внесите необходимые изменения в скопированный отчет и проведите тестирование.
Чтобы обновить исходный отчет без изменения URL, используйте служебный скрипт для перепривязки адресов.
В результате:
- Новый (скопированный) отчет получает адрес исходного отчета.
- Исходный отчет получает новый адрес.
Применять скрипт нужно в базе данных с метаданными Modus BI. Данные подключения к базе метаданных вы можете посмотреть в файле modusbi.json, подробнее про базу в разделе «База данных Аналитического портала».
Примечание — рекомендуется сделать резервную копию базы данных перед внесением изменений. Некорректное изменение данных в базе может привести к сбоям в работе портала.
-- Пример вызова функции
SELECT modusbi_exchange_report_numbers(10082, 82); -- Меняет отчеты 10082 и 82 местами
--
-- Последовательность идентификаторов отчетов в аргументах функции не имеет значения.
-- Повторный вызов функции с одинаковыми аргументами, должен приводить состояние отчетов в изначальное состояние.
-- Тело функции:
--
CREATE OR REPLACE FUNCTION modusbi_exchange_report_numbers(x1 integer, x2 integer) RETURNS void AS $BODY$
DECLARE
portal_version text;
group_1 integer;
group_2 integer;
BEGIN
-- Проверяем версию
SELECT "value" into portal_version FROM setting where "name" = 'server.ver';
IF portal_version <> '3.5.15' THEN
RAISE EXCEPTION 'Функция не работает с версией портала %', portal_version;
END IF;
-- Сохраняем группы
SELECT "report_group_id" into group_1 FROM report where "report_id" = x1;
SELECT "report_group_id" into group_2 FROM report where "report_id" = x2;
-- Меняем свойства отчетов местами
WITH r1 AS (
SELECT "parent_id", "name", "caption", "grid", "globalFilters", "globalCategories", "globalVariables", "description", "remark", "ord", "image_id", "options", "deleted", "change_user", "change_date" FROM report WHERE "report_id" = x1
), r2 AS (
SELECT "parent_id", "name", "caption", "grid", "globalFilters", "globalCategories", "globalVariables", "description", "remark", "ord", "image_id", "options", "deleted", "change_user", "change_date" FROM report WHERE "report_id" = x2
), r1_to_r2 AS (
UPDATE report SET
"parent_id" = r2."parent_id",
"name" = r2."name",
"caption" = r2."caption",
"grid" = r2."grid",
"globalFilters" = r2."globalFilters",
"globalCategories" = r2."globalCategories",
"globalVariables" = r2."globalVariables",
"description" = r2."description",
"remark" = r2."remark",
"ord" = r2."ord",
"image_id" = r2."image_id",
"options" = r2."options",
"deleted" = r2."deleted",
"change_user" = r2."change_user",
"change_date" = r2."change_date"
FROM r2 WHERE report."report_id" = x1
) UPDATE report SET
"parent_id" = r1."parent_id",
"name" = r1."name",
"caption" = r1."caption",
"grid" = r1."grid",
"globalFilters" = r1."globalFilters",
"globalCategories" = r1."globalCategories",
"globalVariables" = r1."globalVariables",
"description" = r1."description",
"remark" = r1."remark",
"ord" = r1."ord",
"image_id" = r1."image_id",
"options" = r1."options",
"deleted" = r1."deleted",
"change_user" = r1."change_user",
"change_date" = r1."change_date"
FROM r1 WHERE report."report_id" = x2;
-- Переподчиняем записи о связях с полями наборов
WITH t1 AS (
SELECT "component_id", "dataset_id", "field_id"
FROM report_link
WHERE "report_id" = x1
), d1 AS (
DELETE FROM report_link WHERE "report_id" = x1
), r2_to_r1 AS (
UPDATE report_link SET "report_id" = x1 WHERE "report_id" = x2
) INSERT INTO report_link ("report_id", "component_id", "dataset_id", "field_id")
SELECT x2, "component_id", "dataset_id", "field_id" FROM t1;
-- Переподчиняем записи о связях с наборами
WITH t1 AS (
SELECT "dataset_id"
FROM report_datasets
WHERE "report_id" = x1
), d1 AS (
DELETE FROM report_datasets WHERE "report_id" = x1
), r2_to_r1 AS (
UPDATE report_datasets SET "report_id" = x1 WHERE "report_id" = x2
) INSERT INTO report_datasets ("report_id", "dataset_id")
SELECT x2, "dataset_id" FROM t1;
-- Переподчиняем записи user_report
WITH t1 AS (
SELECT "user_id", "state"
FROM user_report
WHERE "report_id" = x1
), d1 AS (
DELETE FROM user_report WHERE "report_id" = x1
), r2_to_r1 AS (
UPDATE user_report SET "report_id" = x1 WHERE "report_id" = x2
) INSERT INTO user_report ("report_id", "user_id", "state")
SELECT x2, "user_id", "state" FROM t1;
-- Переподчиняем записи report_transformation
WITH t1 AS (
SELECT "settings", "version", "change_user", "change_date"
FROM report_transformation
WHERE "report_id" = x1
), d1 AS (
DELETE FROM report_transformation WHERE "report_id" = x1
), r2_to_r1 AS (
UPDATE report_transformation SET "report_id" = x1 WHERE "report_id" = x2
) INSERT INTO report_transformation ("report_id", "settings", "version", "change_user", "change_date")
SELECT x2, "settings", "version", "change_user", "change_date" FROM t1;
-- Переподчиняем записи report_export_file
WITH t1 AS (
SELECT "user_id", "report_group", "report", "datasources", "datasets", "report_images"
FROM report_export_file
WHERE "report_id" = x1
), d1 AS (
DELETE FROM report_export_file WHERE "report_id" = x1
), r2_to_r1 AS (
UPDATE report_export_file SET "report_id" = x1, "report_group" = group_1 WHERE "report_id" = x2
) INSERT INTO report_export_file ("report_id", "user_id", "report_group", "report", "datasources", "datasets", "report_images")
SELECT x2, "user_id", group_2, "report", "datasources", "datasets", "report_images" FROM t1;
-- Переподчиняем записи report_user_settings
WITH id_1 AS (
SELECT "report_user_settings_id"
FROM report_user_settings
WHERE "report_id" = x1
), id_2 AS (
SELECT "report_user_settings_id"
FROM report_user_settings
WHERE "report_id" = x2
), r1_to_r2 AS (
UPDATE report_user_settings SET "report_id" = x2 FROM id_1 WHERE report_user_settings."report_user_settings_id" = id_1."report_user_settings_id"
) UPDATE report_user_settings SET "report_id" = x1 FROM id_2 WHERE report_user_settings."report_user_settings_id" = id_2."report_user_settings_id";
-- Переподчиняем записи report_export
WITH id_1 AS (
SELECT "report_export_id"
FROM report_export
WHERE "report_id" = x1
), id_2 AS (
SELECT "report_export_id"
FROM report_export
WHERE "report_id" = x2
), r1_to_r2 AS (
UPDATE report_export SET "report_id" = x2 FROM id_1 WHERE report_export."report_export_id" = id_1."report_export_id"
) UPDATE report_export SET "report_id" = x1 FROM id_2 WHERE report_export."report_export_id" = id_2."report_export_id";
END;
$BODY$
LANGUAGE plpgsql;
Чтобы пользователь мог создать функцию, ему необходимы права USEGE и CREATE в схеме, где содержаться метаданные портала.
-- Предоставление доступа пользователю "user_test" для создания функции
GRANT CREATE ON SCHEMA public TO user_test;
GRANT USAGE ON LANGUAGE plpgsql TO user_test;
-- Предоставление доступа пользователю "user_test" для использования функции
GRANT SELECT ON public.setting TO user_test;
GRANT UPDATE, SELECT, DELETE, INSERT ON public.report TO user_test;
GRANT UPDATE, SELECT, DELETE, INSERT ON public.report_link TO user_test;
GRANT UPDATE, SELECT, DELETE, INSERT ON public.report_datasets TO user_test;
GRANT UPDATE, SELECT, DELETE, INSERT ON public.user_report TO user_test;
GRANT UPDATE, SELECT, DELETE, INSERT ON public.report_transformation TO user_test;
GRANT UPDATE, SELECT, DELETE, INSERT ON public.report_export_file TO user_test;
GRANT UPDATE, SELECT, DELETE, INSERT ON public.report_user_settings TO user_test;
GRANT UPDATE, SELECT, DELETE, INSERT ON public.report_export TO user_test;