|
|---|
Вместе с платформой "Первая Форма" поставляются некоторые полезные хранимые функции, которые можно использовать при настройке системы.
Процедуры
Служит для получения списка задач. Поддерживает сортировки, группировки, пейджинг и различные фильтры |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Используется на фронте в следующих местах: •Лента задач oВсе типы (/api/tasks/feedsBySP) •Представления категории oГрид (/api-core/datasource/subcat/{subcatId}/data) oКанбан (/api/tasks/feedsBySP) oЛента задач (все типы) (/api/tasks/feedsBySP) •Чаты oВсе/Личные/Группы (/api/chats) oПодписка/Избранное (/api/tasks/feedsBySP) •Мои задачи oЗаказчик (/api-core/datasource/owner/data) oИсполнитель (/api-core/datasource/performer/data) oПодписка (/api-core/datasource/mytasks/data) oСогласованные вами (/api-core/datasource/Signatures/data) oОтклоненные вами (/api-core/datasource/Signatures/data) Вызовы ShowTasksFeed сохраняются в специализированную таблицу dba_util.ShowTasksFeed_Execlog,что позволяет анализировать, какой пользователь и в какое время инициировал данный запрос. Для детального изучения конкретного вызова необходимо по колонке Recid из таблицы логов вызвать функцию dba_util.ComposeShowTasksFeedSttFromLog. Если вывод результата запроса настроен корректно и не подвергается обрезке, результатом работы функции будет полная команда ShowTasksFeed со всеми исходными параметрами, что позволяет точно воспроизвести первоначальный запрос для диагностики или аудита. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Аргументы
Одновременное использование флагов MyTasksOnlyF, TaskHelperOnlyF, SubscriberOnlyF, AcceptantOnlyF и ExtParamUserInvolvanceF работает по принципу объединения (не пересечения). Это означает, что выборка будет содержать задачи, в которых пользователь задействован в любой из указанных ролей: является заказчиком (MyTasksOnlyF), исполнителем (TaskHelperOnlyF), подписчиком (SubscriberOnlyF), акцептантом (AcceptantOnlyF) или указан в дополнительном параметре "Выбор пользователя" (ExtParamUserInvolvanceF). |
Выделяет из xml-структуры отдельные параметры и представляет их в виде таблицы |
||||||||
Входные параметры: o@XmlParam xml В xml-структуре могут быть ключи: Name, Value, ValueRaw, From, To |
||||||||
Возвращает таблицу, каждая строка которой описывает один параметр из xml-структуры. Колонки таблицы:
|
Выполняет денормализацию категории |
Входные параметры: •@SubcatID int — можно не указывать, если заданы @TaskID или @IDs •@TaskID int — указывать при обновлении одной задачи •@MinTaskID int, @MaxTaskID int — указывать при обновлении диапазона задач •@IDs id_tbl_type — (массив) указывать при обновлении нескольких задач •@Action varchar(16) = 'update' — возможные значения: update, insert, merge Если не указан ни один из параметров @TaskID, @MinTaskID, @MaxTaskID и @IDs, то выполняется денормализация категории @SubcatID. |
Возвращает таблицу с денормализованной категорией или задачами |
Выполняет загрузку файла в ДП |
Входные параметры: •@UserID int •@TaskID int •@ExtParamID int •@FileName varchar •@FileData nvarchar |
Анализирует наличие индекса на ДП |
Входные параметры: •@ExtParamID int — ID ДП •@ThresholdTaskCount int — Пороговое количество задач, необязательный параметр |
Возвращает таблицу с полями SubcatID, SubcatDescription, ExtParamName, MakeMeHappyStatement, ExistingSuitableIndexName, ColMaxLength, AlreadyExistsF, KeyMaxLengthNotRestrictedF, created_ix.KeyMaxLenExceededF, maxlenstt_data.TaskCount, SubcatTaskTextMaxLength ,maxlenstt_data.FactMaxLength |
Выполняет обновление тикеров |
Входные параметры: •@SubcatID int •@DebugF bit |
Удаляет задачи в системе |
Входной параметр: •@TaskIDs id_tbl_type |
Вычисляет права пользователей к файлам Диска |
Входной параметр: •@UserID int |
Позволяет при подписке получить пользователю доступ не только к новым, но и ко всем ранее опубликованным постам сообщества или пользователя, созданными до момента подписки. Вызывается при подписке пользователя к задачам категории с типом "Группы соц. сети" |
Входные параметры: •@UserID int — ID текущего пользователя •@TaskID int — Номер задачи (сообщества), на которую пользователь подписался |
Тестирование производительности диска, путем измерения скорости записи и чтения файлов размером 200 МБ |
Предназначена для проведения теста производительности (бенчмарка) дисковой подсистемы в БД. Она измеряет скорость записи и чтения больших объемов данных, что позволяет оценить реальную эффективность работы хранилища. Процедура создает временную тестовую таблицу Test_PreUploadedOnPostTaskFiles в базе данных, если она не существует, и готовит тестовый блок данных объемом 200 МБ. Измеряется время, за которое сервер может записать этот 200 МБ блок данных в созданную таблицу. Результат в миллисекундах выводится в сообщениях SQL Server. После записи процедура считывает только что записанные данные и измеряет время, затраченное на эту операцию. Результат также выводится в сообщениях. По завершении теста временная таблица удаляется. Входные параметры: •@FileContent varbinary(max) •@StartDT datetime2 •@FileId int •@EndOfInsertDT datetime2 •@EndOfSelectDT datetime2 |
Процедуры для статистики по браузерной телеметрии
GetBrowserMemoryStats (MS SQL)
|
Процедуры для удаления неиспользуемых индексов на денорм.таблицах
dba_util.usp_get_unused_indexes_drop_script
|
Утилита сканирует SQL-модули в текущей базе данных и находит "битые" ссылки — ссылки на объекты, которые не существуют в sys.objects |
Алгоритм работы 1. Валидация входного параметра (строки 19–30) Если передан @ModuleName, резолвится его object_id. Если модуль не найден — сразу возвращается ошибка (error_number 50001), дальше не идёт. 2. CTE Modules (строки 36–54) Собирает список модулей для анализа из sys.objects: •Типы: P (процедуры), FN/TF/IF (функции), опционально V (вью) •Фильтры: is_ms_shipped = 0, опционально modify_date >= @Since •Исключения: sp_Blitz* (утилиты Brent Ozar) 3. CTE Refs (строки 56–80) Читает зависимости из sys.sql_expression_dependencies — это статический кеш SQL Server, без вызова sp_refreshsqlmodule. Отфильтровываются: •Только ссылки на объекты (OBJECT_OR_COLUMN, referenced_minor_id = 0) •Убираются временные таблицы (#%), схема sys, маска @IgnoreNameLike, кросс-серверные/кросс-БД ссылки 4. CTE Missing (строки 127–142) Формирует строки только для реально отсутствующих ссылок, с пометками: •(no schema) — схема не определилась •(schema not found) — схема не существует в БД •Иначе — [schema].[object] 5. Основной SELECT (строки 143–153) Агрегирует через string_agg все отсутствующие ссылки модуля в одну строку missing_refs, группировка по модулю. 6. Второй результирующий набор (строки 158–200) Отдельно выводит зашифрованные/недоступные модули (sys.sql_modules.definition IS NULL). Запрос выполняется только если такие есть (IF EXISTS). Входные параметры: •@ModuleName — Проверить конкретный модуль или все •@Since — Только модули, изменённые после даты •@IncludeViewsF — Включать/исключать VIEW •@IgnoreNameLike — LIKE-маска игнорируемых имён •@ShowUnresolvedNoSchemaF — Показывать ссылки без схемы Выходные данные: •Результат 1 — модули с битыми ссылками: module_full_name | module_type_desc | module_modify_date | missing_refs [dbo].[MyProc] | SQL_STORED_PROC | 2024-01-15 10:00:00| [dbo].[MissingTable], [dbo].[GoneProc] •Результат 2 (только если есть) — зашифрованные модули: module_full_name | module_type_desc | module_modify_date | error_message [dbo].[Secret] | SQL_STORED_PROC | ... | Module is encrypted or definition unavailable |
Функции, возвращающие скалярную величину
Заменяет в строке служебные символы |
|
|---|---|
Входные параметры: •@String nvarchar(max) |
|
Возвращает @String nvarchar(max) |
|
Заменяет в строке @String символы & < > « » " « » <br/>, <p> на &, <, >, " и перевод строки, <strong> на <b>, <em> на <i>, <s> на <strike>, <ol> и <li> на буллет, <ul> удаляется, <span style="color:' на <font color=', <span style="background-color: удаляется |
|
|
Убирает из строки все теги (все, что находится между символами < и >) |
|
Входные параметры: •@HTMLText varchar(max) |
|
Возвращает @String varchar(max) |
|
|
Возвращает название месяца на русском языке |
Входные параметры: •@MonthNumber int |
Возвращает varchar(50) |
tc_AddWorkingDays, tc_AddWorkingHours, tc_AddWorkingMinutes, tc_AddWorkingMonths, tc_AddWorkingYears
Прибавляет к дате указанное число рабочих дней (часов, минут, месяцев, лет) |
Входные параметры:
•@DateTime datetime, •@Days int |
Возвращает datetime |
tc_DiffWorkingDays, tc_DiffWorkingHours, tc_DiffWorkingMinutes
Считает разницу между двумя датами в рабочих днях (часах, минутах) |
Входные параметры:
•@BeginDate datetime, •@EndDate datetime |
Возвращает int |
Преобразует исходную дату в строку указанного формата |
||||||||||||||||||||||||||||||||||||
Входные параметры: •@Datetime datetime, •@FormatMask nvarchar(max), •@Locale varchar(32) = 'ru' |
||||||||||||||||||||||||||||||||||||
Возвращает nvarchar(max) |
||||||||||||||||||||||||||||||||||||
•В параметре @Datetime передается исходная дата. •В параметре @FormatMask передается маска формата, к которому надо привести исходную дату. В маске можно использовать следующие элементы:
Пример: 'dd Month yyyy'. •В формате @Locale передается локаль, а для русской локали — падеж. Возможные значения:
|
Cумма в рублях прописью |
Входные параметры: •@Value money |
Возвращает строку с указанной суммой в рублях (прописью) и копейках (числом). Пример реализации: DECLARE @Value money = (SELECT ExtParamХХХNativeValue FROM dbo.TasksInSubcatХХХDenormalized WHERE TaskId = @ContextID) SELECT dbo.rss_RubPhrase(@Value) |
Целое число прописью с учетом мужского/женского рода |
Входные параметры: •@Num BIGINT •@IsMaleGender bit=1 |
Возвращает строку с указанным числом прописью |
Расчет счетчика непрочитанных комментариев в чатах |
Входные параметры: •@UserID int •@ForChatF bit |
Возвращает строку с количеством непрочитанных комментариев |
Расчет счетчика подписей |
Входные параметры: • @UserID int •@SignatureStateID int |
Возвращает строку с количеством подписей, для которых требуется вынести решение по резолюции |
Функции, возвращающие таблицу
Раскладывает строку на значения и возвращает их в виде таблицы |
|
Входные параметры: •@String varchar(max) — содержит значения, разделенные символом @Delimiter (например, значения, перечисленные через запятую), •@Delimiter varchar(max) — содержит символ-разделитель (например, ',') |
|
Возвращает таблицу с колонкой value |
|
|
Выделяет из xml-структуры отдельные параметры и возвращает их в виде таблицы |
||||||||||
Входные параметры: •@XmlParam xml В xml-структуре могут быть ключи: Name, Value, ValueRaw, From, To |
||||||||||
Возвращает таблицу, каждая строка которой описывает один параметр из xml-структуры. Колонки таблицы:
|
Раскладывает строку на значения и возвращает их в виде таблицы |
Входные параметры: •@String varchar(max), •@Delimiter varchar(max) |
Возвращает таблицу с колонками id (порядковый номер) и value |
Добавляет цвет текста и фона полям с списке задач в категории в зависимости от условий |
||
Входные параметры: •@TaskID int, •@UserId int) |
||
При выводе списка задач в категории этот список автоматически объединяется (делается join) с результатом выполнения функции fn_TaskColor, и в итоговом результате отдельные поля и значения могут получать свои собственные атрибуты цвета для текста и фона. Стилизовать можно следующие поля: •Текст задачи •Статус •Срок •Заказчик •Исполнитель •Плановые трудозатраты •Фактические трудозатраты Функция поставляется вместе с платформой. Администратор должен вручную отредактировать функцию так, чтобы она возвращала нужные значения (например, добавить UNION ALL для определенной категории).
|
Определяет права доступа пользователя к задачам в указанной категории |
|---|
Входные параметры: •@UserID int, •@SubcatID int |
Возвращает строки таблицы Tasks с задачами из категории @SubcatID, к которым пользователь @UserID имеет доступ |
Определяет принадлежность пользователя к уровням орг.структуры |
|---|
Входные параметры: •@UserID int |
Возвращает атрибуты Id, Name, ParentId, OrgStructureTypeId, IsActual, DoNotShowInOrgStructure, IsDirector LinkedGroupId, GuidFrom1C, IsFuncGroup, AppointmentId, Description, LocalizedNameId из таблицы UserOrgStructureUnit, относящиеся к пользователю @UserID |
Получает отображаемое имя пользователя (DisplayName) в режиме представления имен сессионного пользователя |
Входные параметры: • @UserID int — ID пользователя, имя которого нужно получить • @SessionUserID int — ID пользователя, совершающего действие ALTER function [dbo].[fn_UserDisplayName] ( @UserID int, -- Id пользователя, имя которого нужно получить @SessionUserID int -- Id пользователя, совершающего действие ) returns table as return ( select unm.DisplayName from dbo.Users sess_user with(nolock) left join dbo.UserNameModes unm on unm.UserNameMode = sess_user.UserNameMode and unm.LanguageID = sess_user.LanguageID and unm.UserID = @UserID where sess_user.UserID = @SessionUserID ); |
Возвращает отображаемое имя заданного пользователя для того же языка и формата, что и у текущего пользователя |
Расчет количества записей в кастомных индикаторах |
Входные параметры: •@UserID int •@EnableChatsF bit •@CustomTypesOnly bit •@DebugF bit |
Подставляет значения параметров ($1, $2, ...) в SQL-запрос для отладки. Вместо ручной замены плейсхолдеров автоматически создает готовый к выполнению SQL. Может валидировать синтаксис через PREPARE без реального выполнения |
Функция для подстановки значений параметров ($1..$N) в SQL-запрос. Полезна для отладки запросов в dbForge / psql. Опционально валидирует сконструированный запрос через PREPARE. drop function if exists dba_util.util_render_sql_for_exec(varchar, varchar, bool); create or replace function dba_util.util_render_sql_for_exec ( p_sql varchar, p_bindings varchar, p_validate_f bool = false ) returns table ( sql_text varchar, error_message varchar ) language plpgsql as $$ declare v_bindings varchar; v_part varchar; v_match text[]; v_key int; v_val varchar; v_out_sql varchar := p_sql; v_stmt_name varchar := 'validate_' || md5(random()::varchar); v_error varchar := null; begin v_bindings := trim(p_bindings);
-- Убираем внешние кавычки, если есть if left(v_bindings, 1) = '"' and right(v_bindings, 1) = '"' then v_bindings := substr(v_bindings, 2, length(v_bindings) - 2); end if;
-- Разбираем каждый параметр вида $N = value -- Используем dbo.SplitExpr для корректного разбиения с учётом кавычек и скобок for v_part in select unnest(dbo.SplitExpr(v_bindings, ',')) loop v_match := regexp_match(v_part, '^\s*\$(\d+)\s*=\s*(.+)\s*$', 'i');
if v_match is null then continue; end if;
v_key := v_match[1]::int; v_val := trim(v_match[2]);
if upper(v_val) = 'NULL' then v_val := 'NULL'; end if;
-- Заменяем $N на значение (negative lookahead чтобы не захватить $12 при замене $1) v_out_sql := regexp_replace(v_out_sql, '\$' || v_key::varchar || '(?!\d)', v_val, 'g'); end loop;
-- Валидация через PREPARE (проверяет синтаксис без выполнения) if p_validate_f then begin execute 'prepare ' || v_stmt_name || ' as ' || v_out_sql; execute 'deallocate ' || v_stmt_name; exception when others then v_error := sqlerrm; end; end if;
return query select v_out_sql, v_error; end; $$; Примеры использования: Пример 1: только подстановка (без валидации) select * from dba_util.util_render_sql_for_exec( 'select * from dbadmin.DbaQueryFormSchema (p_formid := $1, p_userid := $2)', '$1 = ''275'', $2 = ''29717''' ); -- sql_text: select * from dbadmin.DbaQueryFormSchema (p_formid := '275', p_userid := '29717') -- error_message: NULL Пример 2: подстановка + валидация успешная select * from dba_util.util_render_sql_for_exec( 'select * from dbadmin.DbaQueryFormSchema (p_formid := $1, p_userid := $2)', '$1 = ''275'', $2 = ''29717''', p_validate_f := true ); -- sql_text: select * from dbadmin.DbaQueryFormSchema (p_formid := '275', p_userid := '29717') -- error_message: NULL (если функция существует) Пример 3: невалидный SQL — ошибка в error_message select * from dba_util.util_render_sql_for_exec( 'select * from несуществующая_таблица where id = $1', '$1 = 123', p_validate_f := true ); -- sql_text: select * from несуществующая_таблица where id = 123 -- error_message: relation "несуществующая_таблица" does not exist Пример 4: параметр со строкой, содержащей запятые select * from dba_util.util_render_sql_for_exec( 'select * from test where name = $1 and id = $2', '$1 = ''a,b,c'', $2 = 123' ); -- sql_text: select * from test where name = 'a,b,c' and id = 123 -- error_message: NULL */ |
|