por Wagner Aparecido Miranda - W2R Consultoria e Sistemas ProblemaAs chaves estrangeiras (FK) sao projetados para manter a integridade referencial em seu banco de dados. Quando usado corretamente FKS permitem ter certeza de que seus dados estao intactos e ha registros de nenhum orfao. No outro lado do uso de FKS para manter a integridade referencial, eles tambem se tornam um problema quando voce precisa mudar estruturas de tabela ou modificar temporariamente dados que possam violar a restricao de chave estrangeira. Outras dicas foram escritos que mostram como identificar seus FKS e por que voce deve usa-los, mas o que e a melhor abordagem para manipular restricoes FK para fazer a estrutura ou alteracoes de dados?SolucaoAbaixo esta um script que pode ser usado para encontrar todas as chaves estrangeiras que fazem referencia a tabela primaria que voce deseja trabalhar. Neste roteiro voce fornecer o nome da tabela eo nome do esquema (proprietario do objeto). O script ira retornar uma lista de afirmacoes que podem ser copiados e colados em uma janela de consulta para fazer essas mudancas.O roteiro tambem leva tres valores de parametros diferentes, dependendo da acao que voce deseja tomar:DISABLE - isso ira criar o comando para desativar todas as restricoes FK que fazem referencia a tabela que voce esta trabalhando comENABLE- isso ira criar o comando para ativar todas as restricoes FK que fazem referencia a tabela que voce esta trabalhando comDROP - isso ira criar um comando para retirar todas as restricoes FK e criar um comando para criar todas as restricoes FK que fazem referencia a tabela esta trabalhando comOs valores abaixo de usar uma tabela no banco de dados Corpore, assim voce pode simplesmente copiar e colar este codigo e executar esse exemplo contra o banco de dados.SET NOCOUNT ONDECLARE @operation VARCHAR(10) DECLARE @tableName sysname DECLARE @schemaName sysname SET @operation = 'DROP' ---- ENABLE, DISABLE, DROP SET @tableName = 'GCCUSTO' SET @schemaName = 'dbo' DECLARE @cmd NVARCHAR(1000)DECLARE @FK_NAME sysname, @FK_OBJECTID INT, @FK_DISABLED INT, @FK_NOT_FOR_REPLICATION INT, @DELETE_RULE smallint, @UPDATE_RULE smallint, @FKTABLE_NAME sysname, @FKTABLE_OWNER sysname, @PKTABLE_NAME sysname, @PKTABLE_OWNER sysname, @FKCOLUMN_NAME sysname, @PKCOLUMN_NAME sysname, @CONSTRAINT_COLID INTDECLARE cursor_fkeys CURSOR FOR SELECT Fk.name, Fk.OBJECT_ID, Fk.is_disabled, Fk.is_not_for_replication, Fk.delete_referential_action, Fk.update_referential_action, OBJECT_NAME(Fk.parent_object_id) AS Fk_table_name, schema_name(Fk.schema_id) AS Fk_table_schema, TbR.name AS Pk_table_name, schema_name(TbR.schema_id) Pk_table_schema FROM sys.foreign_keys Fk LEFT OUTER JOIN sys.tables TbR ON TbR.OBJECT_ID = Fk.referenced_object_id --inner join WHERE TbR.name = @tableName AND schema_name(TbR.schema_id) = @schemaNameOPEN cursor_fkeys FETCH NEXT FROM cursor_fkeys INTO @FK_NAME,@FK_OBJECTID, @FK_DISABLED, @FK_NOT_FOR_REPLICATION, @DELETE_RULE, @UPDATE_RULE, @FKTABLE_NAME, @FKTABLE_OWNER, @PKTABLE_NAME, @PKTABLE_OWNERWHILE @@FETCH_STATUS = 0 BEGIN -- criar declaracao para permitir FK IF @operation = 'ENABLE' BEGIN SET @cmd = 'ALTER TABLE [' + @FKTABLE_OWNER + '].[' + @FKTABLE_NAME + '] CHECK CONSTRAINT [' + @FK_NAME + ']' PRINT @cmd END -- create statement for disabling FK IF @operation = 'DISABLE' BEGIN SET @cmd = 'ALTER TABLE [' + @FKTABLE_OWNER + '].[' + @FKTABLE_NAME + '] NOCHECK CONSTRAINT [' + @FK_NAME + ']' PRINT @cmd END -- criar declaracao para excluir uma FK e tambem para a recriacao de FK IF @operation = 'DROP' BEGIN -- comando drop SET @cmd = 'ALTER TABLE [' + @FKTABLE_OWNER +