sql >> Database >  >> RDS >> Sqlserver

Scripts genereren om beperkingen voor externe sleutels in SQL Server-database opnieuw te maken - SQL Server / TSQL-zelfstudie, deel 73

Scenario:

U moet alle tabellen in de SQL Server-database afkappen. Wanneer u de instructie truncate uitvoert, krijgt u onderstaande fout.
Msg 4712, Level 16, State 1, Line 43
Kan tabel 'SchemaName' niet afkappen. TableName' omdat ernaar wordt verwezen door een FOREIGN KEY-beperking.

De gemakkelijke manier zou zijn om de Foreign Key Constraints te laten vallen, de tabellen af ​​te kappen en de Foreign Key Constraint opnieuw te creëren.

Ik heb een bericht geschreven dat je kunt gebruiken om Drop Foreign Key Constraints in een database te genereren. Klik hier.
Maar voordat we ze laten vallen, moeten we de scripts Create Foreign key Constraints genereren, zodat we deze kunnen uitvoeren nadat we de tabel hebben afgekapt.

U kunt het onderstaande script gebruiken om een ​​truncate-tabelinstructie te genereren voor alle gebruikerstabellen uit een database.

Select 'Truncate table '+'['
+Schema_name(Schema_id)
+'].['+name+']' as TruncateTablesScript
from sys.tables
where is_ms_shipped=0
 
Het onderstaande script kan worden gebruikt om Foreign Key Constraint opnieuw te genereren in een database.

;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
 
 
 
Script genereren om Foreign Key Constraint opnieuw te creëren in SQL Server-database
 Neem de resultaten van CreateForeignKeyConstraintScript Column. Ik raad je aan om de scripts eerst in DEV of QA uit te voeren om er zeker van te zijn dat ze allemaal goed werken voordat je ze in Production uitvoert.



Videodemo:Hoe maak je een scripts om externe Key Constraints in SQL Server opnieuw te creëren

  1. Query uit twee tabellen in rapport

  2. Tabellen koppelen met behulp van de Room-database in Android Studio

  3. 4 manieren om een ​​lijst met schema's te krijgen in SQL Server Agent (T-SQL)

  4. ORA-12154 kan de opgegeven verbindings-ID niet oplossen