Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So generieren Sie Skripts zum erneuten Erstellen von Fremdschlüsseleinschränkungen in der SQL Server-Datenbank – SQL Server / TSQL-Tutorial Teil 73

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