Публикация

Определить связи таблицы

Добрый день!

Иногда необходимо знать с какими таблицами связана та или иная таблица и сколько связанных записей в них присутствует.
Для получения информации о связях записи с таблицами выполните на SQL сервере приведенный ниже скрипт. Выделенный текст можно изменять в зависимости от того какая запись и из какой таблицы Вас интересует.

declare @PrimaryTableName sysname
declare @RecordID uniqueidentifier
declare @SQL nvarchar(2000)

declare @TableName sysname
declare @Caption nvarchar(250)
declare @DeleteRule int
declare @FKColumnName sysname

--здесь укажите название таблицы
SET @PrimaryTableName = 'tbl_Account'
--здесь укажите интересующую Вас запись, либо удалите строку, если просто
--хотите увидеть связи искомой таблицы
SET @RecordID = '{D083AE11-ED14-4363-A20D-32967B3777C8}'

CREATE TABLE #FKEYSNAMES(
PKTABLE_QUALIFIER sysname collate database_default NULL,
PKTABLE_OWNER sysname collate database_default NULL,
PKTABLE_NAME sysname collate database_default NOT NULL,
PKCOLUMN_NAME sysname collate database_default NOT NULL,
FKTABLE_QUALIFIER sysname collate database_default NULL,
FKTABLE_OWNER sysname collate database_default NULL,
FKTABLE_NAME sysname collate database_default NOT NULL,
FKCOLUMN_NAME sysname collate database_default NOT NULL,
KEY_SEQ smallint NOT NULL,
UPDATE_RULE smallint NULL,
DELETE_RULE smallint NULL,
FK_NAME sysname collate database_default NULL,
PK_NAME sysname collate database_default NULL,
DEFERRABILITY smallint NULL)

 
INSERT INTO #FKEYSNAMES
EXEC [sp_fkeys] @pktable_name = @PrimaryTableName

declare c_Temp cursor FOR
         SELECT DISTINCT [s].[Caption], [k].[FKTABLE_NAME], [k].[DELETE_RULE], [k].[FKCOLUMN_NAME]
         FROM #FKEYSNAMES [k]
         LEFT OUTER JOIN [tbl_Service] s
         ON [k].[FKTABLE_NAME] = [s].[Code]

open c_Temp

while 1 = 1
begin
         fetch next FROM c_Temp INTO @Caption, @TableName, @DeleteRule, @FKColumnName        

         IF @@fetch_status = -1 break
         IF @@fetch_status = -2 continue

         SET @SQL = 'declare @P1 nvarchar(50) set @P1 = (select count(*) from ' + @TableName + ' where ' + @FKColumnName + ' = ''' + cast(@RecordID AS nvarchar(38)) + ''') select @P1 + '' records in '''
         
         exec sp_executesql @SQL
         SELECT @TableName
 
end

close c_Temp
deallocate c_Temp

 
DROP TABLE #FKEYSNAMES

Как результат:

1

Нравится

Поделиться

1 комментарий

Дмитрий, я бы указал, что для поиска связи для таблицы, которая администрируется по записям (например, Контрагенты (tbl_Account)), необходимо обладать правами администратора (sysadmin на сервере или db_owner в конкретной БД), так как у обычного пользователя доступ только на представление vw_Account, а по представлению такую информацию не просто получить.

Показать все комментарии