sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man genererar skript för att återskapa främmande nyckelbegränsningar i SQL Server Database - SQL Server / TSQL Tutorial Del 73

Scenario:

Du måste trunkera alla tabeller i SQL Server-databasen, när du kör truncate-satsen får du felet under felet.
Msg 4712, Level 16, State 1, Rad 43
Kan inte trunkera tabellen 'SchemaName. TableName' eftersom den refereras av en FOREIGN KEY-begränsning.

Det enkla sättet skulle vara att släppa begränsningarna för främmande nyckel, trunkera tabellerna och återskapa begränsningen för främmande nyckel igen.

Jag skrev ett inlägg som du kan använda för att generera Drop Foreign Key Constraints i en databas. Klicka här.
Men innan vi släpper dem måste vi skapa skripten för att skapa främmande nyckelbegränsningar så att vi kan köra efter att vi har trunkerat tabellen.

Du kan använda skriptet nedan för att generera trunkeringstabellsatsen för alla användartabeller från en databas.

Select 'Truncate table '+'['
+Schema_name(Schema_id)
+'].['+name+']' as TruncateTablesScript
from sys.tables
where is_ms_shipped=0
 
Skriftet nedan kan användas för att återskapa främmande nyckelbegränsningar i en databas.

;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
 
 
 
Hur man genererar skript för att återskapa främmande nyckelbegränsningar i SQL Server Database
 Ta resultaten från CreateForeignKeyConstraintScript-kolumnen. Jag föreslår att du kör skripten i DEV eller QA först för att se till att allt fungerar bra innan du kör i produktion.



Videodemo :Hur man skapar generera skript för att återskapa främmande nyckelbegränsningar i SQL Server

  1. Hur man åtgärdar felaktigt strängvärde i MySQL

  2. Hur får man ett datum i formatet ÅÅÅÅ-MM-DD från ett TSQL-datumtidfält?

  3. SQLite VAKUUM

  4. Förhindrar SQL-injektion i Node.js