Сценарий:
Трябва да съкратите всички таблици в базата данни на 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
