sql >> Databáze >  >> RDS >> Sqlserver

Jak generovat skripty pro opětovné vytvoření omezení cizích klíčů v databázi SQL Server - SQL Server / Výukový program TSQL, část 73

Scénář:

Je třeba zkrátit všechny tabulky v databázi SQL Server, když se při spuštění příkazu zkrácení zobrazí chyba pod chybou.
Msg 4712, Level 16, State 1, Line 43
Nelze zkrátit tabulku 'SchemaName. TableName', protože na něj odkazuje omezení FOREIGN KEY.

Snadným způsobem by bylo zrušit omezení cizího klíče, zkrátit tabulky a znovu vytvořit omezení cizího klíče.

Napsal jsem příspěvek, který můžete použít ke generování omezení cizího klíče v databázi. Klikněte zde.
Ale než je vypustíme, musíme vygenerovat skripty Create Foreign Key Constraints, abychom je mohli spustit po zkrácení tabulky.

Skript níže můžete použít ke generování příkazu trincate table pro všechny uživatelské tabulky z databáze.

Select 'Truncate table '+'['
+Schema_name(Schema_id)
+'].['+name+']' as TruncateTablesScript
from sys.tables
where is_ms_shipped=0
 
Níže uvedený skript lze použít k opětovnému vygenerování omezení cizího klíče v databázi.

;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
 
 
 
Jak vygenerovat skript pro opětovné vytvoření omezení cizího klíče v databázi SQL Server
 Vezměte výsledky z CreateForeignKeyConstraintScript Column. Doporučuji vám nejprve spustit skripty v DEV nebo QA, abyste se ujistili, že všechny fungují správně, než spustíte produkci.



Video Demo:Jak vytvořit generování skripty pro opětovné vytvoření omezení cizího klíče v SQL Server

  1. Existuje způsob, jak nastavit čas vypršení platnosti, po kterém se záznam dat v PostgreSQL automaticky smaže?

  2. SQL Azure:Databáze XXXYYY na serveru momentálně není k dispozici

  3. Nejlepší nové funkce Oracle 12c

  4. Jak vypočítat procento růstu týden po týdnu v MySQL