Baú de Dev

[Script] Exportar todas as chaves estrangeiras (foreign keys) de uma base no SQL Server

Confira mais um script para auxiliar na tarefa de identificar os objetos referenciais de uma base SQL Server. Dessa vez disponibilizo um script para identificar e gerar a DDL de todas as Foreign Keys (chaves estrangeiras).

No meu último post falei sobre como exportar as chaves primárias de todas as tabelas de uma determinada base de dados no SQL Server. Agora postarei o script para fazer o levantamento de todas as chaves estrangeiras (foreign keys).

A idéia é exatamente a mesma: extrair a DDL de criação de cada chave para ser criada em outra base.

-- Cursor principal 
DECLARE cFK CURSOR FOR 
SELECT DISTINCT 
	OBJECT_NAME(F.PARENT_OBJECT_ID) AS TABLE_NAME, 
	F.NAME AS fk_name, 
	OBJECT_NAME (F.REFERENCED_OBJECT_ID) AS remote_table_name 
FROM SYS.FOREIGN_KEYS AS F 
	INNER JOIN SYS.FOREIGN_KEY_COLUMNS AS FC ON F.OBJECT_ID = FC.CONSTRAINT_OBJECT_ID 
ORDER BY OBJECT_NAME(F.PARENT_OBJECT_ID) 
 
DECLARE @FkTable SYSNAME 
DECLARE @FkName SYSNAME 
DECLARE @FkTableRemote SYSNAME 
 
-- Abre o cursor e inicia o loop para cada FK 
OPEN cFK 
FETCH NEXT FROM cFK INTO @FkTable, @FkName, @FkTableRemote 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
	DECLARE @FKSQL NVARCHAR(4000) 
	SET @FKSQL = '' 
	SET @FKSQL = 'ALTER TABLE DBO.' + @FkTable + ' ADD CONSTRAINT ' + @FkName + ' FOREIGN KEY (' 
 
	-- Identifica todas as colunas que compoem a FK 
	DECLARE cFKCol CURSOR FOR 
	SELECT 
		COL_NAME(FC.PARENT_OBJECT_ID,FC.PARENT_COLUMN_ID), 
		COL_NAME(FC.REFERENCED_OBJECT_ID,FC.REFERENCED_COLUMN_ID) 
	FROM SYS.FOREIGN_KEYS AS F 
		INNER JOIN SYS.FOREIGN_KEY_COLUMNS AS FC ON F.OBJECT_ID = FC.CONSTRAINT_OBJECT_ID 
	WHERE F.name = @FkName 
	ORDER BY constraint_column_id 
 
	OPEN cFKCol 
	DECLARE @FkColumnOrig SYSNAME 
	DECLARE @FkColumnDest SYSNAME 
	DECLARE @FKColumns VARCHAR(1000) 
 
	SET @FKColumns = '' 
	DECLARE @PkFirst BIT 
	SET @PkFirst = 1 
 
	-- Abre o cursor e inicia o loop adicionando cada coluna ao comando 
	FETCH NEXT FROM cFKCol INTO @FkColumnOrig, @FkColumnDest 
	WHILE (@@FETCH_STATUS = 0) 
	BEGIN 
		IF (@PkFirst = 1) 
		BEGIN 
			SET @PkFirst = 0 
			SET @FKColumns = '' 
		END 
		ELSE 
		BEGIN 
			SET @FKSQL = @FKSQL + ', ' 
			SET @FKColumns = @FKColumns + ', ' 
		END 
 
		SET @FKSQL = @FKSQL + @FkColumnOrig 
		SET @FKColumns = @FKColumns + @FkColumnDest 
 
		FETCH NEXT FROM cFKCol INTO @FkColumnOrig, @FkColumnDest 
	END 
	CLOSE cFKCol 
	DEALLOCATE cFKCol 
 
	SET @FKSQL = @FKSQL + ') REFERENCES DBO.' + @FkTableRemote + '(' + @FKColumns + ')' 
 
	-- Exibe o conteudo de CREATE da PK 
	PRINT @FKSQL 
	FETCH NEXT FROM cFK INTO @FkTable, @FkName, @FkTableRemote 
END 
CLOSE cFK 
DEALLOCATE cFK

Agora é só seguir em frente e executar o script gerado na sua base “limpa”.

Não esqueça de deixar seu comentário contando sobre como esse script pode ter lhe ajudado.

Até a próxima!

Tagged , , , , ,

About Marcelo Santino

Trabalha como analista e administrador de dados em PostgreSQL, Oracle e SQL Server.

View all posts by Marcelo Santino →

Posts Relacionados

2 comentários em “[Script] Exportar todas as chaves estrangeiras (foreign keys) de uma base no SQL Server

  1. Willian reis

    olha o código formatado:

    — Cursor principal
    DECLARE cFK CURSOR FOR
    SELECT distinct OBJECT_NAME(F.PARENT_OBJECT_ID) as table_name, F.NAME as fk_name, OBJECT_NAME (F.REFERENCED_OBJECT_ID) as remote_table_name
    FROM SYS.FOREIGN_KEYS AS F INNER JOIN SYS.FOREIGN_KEY_COLUMNS AS FC ON F.OBJECT_ID = FC.CONSTRAINT_OBJECT_ID
    ORDER BY OBJECT_NAME(F.PARENT_OBJECT_ID)

    DECLARE @FkTable SYSNAME

    Reply
    • Marcelo Santino Post author

      Willian, obrigado pela correção!
      O Post havia sido publicado com o código identado, mas houve algum problema no WordPress que o deixou em apenas uma única linha.

      Já fiz os ajustes e agora o código está pronto pra uso!

      Abs

      Reply

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *