Замена отчетов

Замена отчета требуется, например, когда необходимо внести изменения в действующий отчет, не прерывая его функционирование. Для этого отчет копируется, в копию вносятся изменения, а затем адреса исходного и скопированного отчетов меняются местами с помощью скрипта.

Сперва скопируйте отчет и разместите его в специальном разделе, например, «Разработка». Скопированный отчет получает новый адрес.

Внесите необходимые изменения в скопированный отчет и проведите тестирование.

Чтобы обновить исходный отчет без изменения 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;