Szenario:
Sie müssen alle Tabellen in der SQL Server-Datenbank kürzen, wenn Sie beim Ausführen der truncate-Anweisung den folgenden Fehler erhalten.Msg 4712, Level 16, State 1, Line 43
Cannot truncate table 'SchemaName. TableName', weil es von einer FOREIGN KEY-Einschränkung referenziert wird.
Der einfache Weg wäre, die Foreign Key-Einschränkungen zu löschen, die Tabellen abzuschneiden und die Foreign Key-Einschränkung erneut zu erstellen.
Ich habe einen Beitrag geschrieben, mit dem Sie Drop Foreign Key Constraints in einer Datenbank generieren können. Klicke hier.
Aber bevor wir sie löschen, müssen wir die Skripte zum Erstellen von Foreign Key Constraints generieren, damit wir sie nach dem Abschneiden der Tabelle ausführen können.
Sie können das folgende Skript verwenden, um die Anweisung zum Abschneiden der Tabelle für alle zu generieren Benutzertabellen aus einer Datenbank.
Select 'Truncate table '+'[' +Schema_name(Schema_id) +'].['+name+']' as TruncateTablesScript from sys.tables where is_ms_shipped=0
Das folgende Skript kann verwendet werden, um Foreign Key Constraint in einer Datenbank neu zu generieren.
;With CTE_FK AS ( SELECT Schema_Name(Schema_id) as TableSchemaName, object_name(FK.parent_object_id) ParentTableName, object_name(FK.referenced_object_id) ReferenceTableName, FK.name AS ForeignKeyConstraintName,c.name as RefColumnName, cf.name as ParentColumnList FROM sys.foreign_keys AS FK INNER JOIN sys.foreign_key_columns AS FKC ON FK.OBJECT_ID = FKC.constraint_object_id INNER JOIN sys.columns c on c.OBJECT_ID = FKC.referenced_object_id AND c.column_id = FKC.referenced_column_id INNER JOIN sys.columns cf on cf.OBJECT_ID = FKC.parent_object_id AND cf.column_id = FKC.parent_column_id where fk.is_ms_shipped=0 ) Select 'Alter table ['+TableSchemaName+'].['+ParentTableName+']' +' Add Constraint '+ForeignKeyConstraintName+ ' Foreign Key('+stuff(( Select ','+ParentColumnList from CTE_FK i where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName and i.TableSchemaName=o.TableSchemaName and i.ParentTableName=o.ParentTableName and i.ReferenceTableName=o.ReferenceTableName for xml path('')), 1, 1, '')+') References '+ '['+TableSchemaName+'].['+ReferenceTableName+']('+stuff(( Select ','+RefColumnName from CTE_FK i where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName and i.TableSchemaName=o.TableSchemaName and i.ParentTableName=o.ParentTableName and i.ReferenceTableName=o.ReferenceTableName for xml path('')), 1, 1, '')+')' AS CreateForeignKeyConstraintScript, ParentTableName, ReferenceTableName, ForeignKeyConstraintName from CTE_FK o group by tableSchemaName, ParentTableName, ReferenceTableName, ForeignKeyConstraintName
Wie man ein Skript generiert, um die Fremdschlüsseleinschränkung in der SQL Server-Datenbank neu zu erstellen |
Nehmen Sie die Ergebnisse aus der CreateForeignKeyConstraintScript-Spalte. Ich schlage vor, dass Sie die Skripte zuerst in DEV oder QA ausführen, um sicherzustellen, dass alles einwandfrei funktioniert, bevor Sie sie in der Produktion ausführen.
Video-Demo:So erstellen Sie Generate Skripte zum Neuerstellen von Foreign Key Constraints in SQL Server