Добрый день, коллеги!
Неоднократно наблюдал на ресурсе вопросы о том, что делать, если запись не удаляется, потому что "уже используется". А функционала по поиску связанных записей в системе нет. Мы также сталкивались с этой проблемой. И до недавнего времени, полагаясь на удачу, удавалось её решить. Пока эта самая удача не закончилась. В итоге было найдено другое решение (правда, пока только для Microsoft SQL Server).
Что вам понадобится:
--Заполнить имя БД
use DirectumRX
GO
--Указать таблицу типа сущности, который не удаляется
DECLARE @tableName nvarchar(max) = 'Sungero_Parties_Counterparty'
DECLARE @CursorQuery nvarchar(max);
--Указать ИД сущности, которая не удаляется
DECLARE @taregtId nvarchar(max) = '32'
DECLARE @tmp_Accounts TABLE (
PKTABLE_QUALIFIER sysname
,PKTABLE_OWNER sysname
,PKTABLE_NAME sysname
,PKCOLUMN_NAME sysname
,FKTABLE_QUALIFIER sysname
,FKTABLE_OWNER sysname
,FKTABLE_NAME sysname
,FKCOLUMN_NAME sysname
,KEY_SEQ smallint
,UPDATE_RULE smallint
,DELETE_RULE smallint
,FK_NAME nvarchar(max)
,PK_NAME nvarchar(max)
,deferrability smallint
)
insert into @tmp_Accounts exec sp_fkeys @tableName
DECLARE CUR_FK CURSOR FAST_FORWARD FOR
select 'select Id, \"' + FKTABLE_NAME + '" from ' + FKTABLE_NAME + ' where ' + FKCOLUMN_NAME + ' = ' + @taregtId from @tmp_Accounts
OPEN CUR_FK
FETCH NEXT FROM CUR_FK INTO @CursorQuery
WHILE @@FETCH_STATUS = 0
BEGIN
exec sp_executesql @CursorQuery
FETCH NEXT FROM CUR_FK INTO @CursorQuery
END
CLOSE CUR_FK
DEALLOCATE CUR_FK
GO
Заполнив параметры, выполните скрипт, который вернет результат в следующем виде:
Если есть связь - вы увидите строку с ИД и наименованием таблицы связанной сущности, ну а найти её в системе уже не составит труда.
Добрый день. Простите, а как посмотреть имя таблицы для нашего типа сущности?
Вот, например, Подразделения - где в SDS это можно увидеть? И что такое SDS?
Илья, SDS (DDS) это Sungero Development Studio (Directum Development Studio) - среда разработки. Справа есть список объектов, в ветке Базовые решения можно найти стандартные справочники. Например для Подразделений
Свои справочники смотрите в своих решениях (отдельные ветки выше Базовых).
Добрый день. Спасибо что поделились скриптом. Недавно он очень пригодился для анализа. Доработанная версия скрипта:
Список изменений:
1. Добавлено экранирование имени поля в запросе квадратными скобочками - "...where [' + FKCOLUMN_NAME + ']..."
Без этой доработки возникала ошибка: "Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the nvarchar value 'dbo' to data type int."
Дело в том что у одной из таблиц есть поле с именем "User", которое при выполнении запроса воспринималось как встроенная функция USER (в моем случае она возвращает "dbo") что и приводило к ошибке.
2. Изменен формат вывода - результат в виде одной таблицы, вместо десятка отдельных таблиц. Дальнейшая группировка и фильтрация выполняется в Excel.
3. Добавлена возможность задавать список ИД записей по которым ищутся связи. Пригождается когда надо анализировать несколько десятков записей, а доступа к БД для выполнения скриптов нет.
4. В результирующей таблице добавлены поля FieldName - имя поле в котором используется искомая запись и FieldValue - значение в поле (нужно для фильтрации когда выполняется поиск по списку ИД)
Может кто-то может поделиться таким же запросом для СУБД PostgreSQL?
Анатолий, не совсем то, но может пригодится.
https://dba.stackexchange.com/questions/205684/select-orphaned-rows-in-a-generic-way
Авторизуйтесь, чтобы написать комментарий