Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да генерирате скриптове за повторно създаване на ограничения за външни ключове в база данни на SQL Server - SQL Server / TSQL Урок, част 73

Сценарий:

Трябва да съкратите всички таблици в базата данни на SQL Server, когато, когато изпълните оператор truncate, получавате грешка под грешката.
Съобщение 4712, ниво 16, състояние 1, ред 43
Не може да се съкрати таблицата 'SchemaName. TableName', защото се позовава на ограничение FOREIGN KEY.

Лесен начин би бил да премахнете ограниченията на външния ключ, да съкратите таблиците и да създадете отново ограничението на външния ключ.

Написах публикация, която можете да използвате за генериране на Drop Foreign Key Constraints в база данни. Натисни тук.
Но преди да ги пуснем, трябва да генерираме скриптове за създаване на ограничения на външния ключ, за да можем да работим след съкращаване на таблицата.

Можете да използвате скрипта по-долу, за да генерирате израз за съкращаване на таблицата за всички потребителски таблици от база данни.

Select 'Truncate table '+'['
+Schema_name(Schema_id)
+'].['+name+']' as TruncateTablesScript
from sys.tables
where is_ms_shipped=0
 
Скриптът по-долу може да се използва за повторно генериране на ограничение на външния ключ в база данни.

;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
 
 
 
Как да генерирате скрипт за повторно създаване на ограничение на външния ключ в базата данни на SQL Server
 Вземете резултатите от колоната CreateForeignKeyConstraintScript. Предлагам ви първо да стартирате скриптовете в DEV или QA, за да се уверите, че всичко работи добре, преди да стартирате в Production.



Видео Демо:Как да създадете генериране скриптове за пресъздаване на ограничения на външния ключ в SQL Server

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да инсталирате SQL Server на Windows

  2. Как да филтрирате обекти в SQL Server Management Studio (SSMS) - SQL Server / TSQL урок, част 19

  3. Групи за наличност на SQL Server AlwaysOn:Инсталиране и конфигуриране. Част 2

  4. Създайте дата от ден месец и година с T-SQL

  5. Използването на SqlParameter в клаузата LIKE на SQL не работи