对复制禁用外键约束

适用于:SQL Server 2016 (13.x) 及更高版本Azure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中对复制禁用外键约束。 如果正在从以前版本的 SQL Server 发布数据,这很有用。

注意

如果表是使用复制发布的,则对于复制代理执行的操作将自动禁用外键约束。 默认情况下为外键约束和检查约束指定 NOT FOR REPLICATION 选项;约束对用户操作强制使用,但不对代理操作强制使用。 当复制代理在订阅服务器上执行插入、更新或删除操作时,将不检查约束;如果用户执行插入、更新或删除操作,则检查约束。 由于最初插入、更新或删除数据时已经在发布服务器上检查过约束,所以对于复制代理将禁用该约束。

权限

需要对表的 ALTER 权限。

使用 SQL Server Management Studio

对复制禁用外键约束

  1. 在“对象资源管理器”中,展开具有要修改的外键约束的表,再展开“键”文件夹。

  2. 右键单击外键约束,再选择“修改”

  3. 在“外键关系”对话框中,针对“强制用于复制” 选择“否”值。

  4. 选择“关闭”

使用 Transact-SQL

对复制禁用外键约束

  1. 若要在 Transact-SQL 中执行此任务,请删除外键约束。 在“对象资源管理器”中,展开具有要修改的外键约束的表,再展开“键”文件夹。

  2. 右键单击外键约束,选择“编写键的脚本为”,然后选择“DROP 和 CREATE 到”,然后选择“新查询编辑器窗口”。 生成的脚本应与 AdventureWorks2022 示例数据库中的以下示例类似:

    ALTER TABLE [Sales].[SalesTerritoryHistory] 
    DROP CONSTRAINT [FK_SalesTerritoryHistory_SalesPerson_BusinessEntityID]
    GO
    
    ALTER TABLE [Sales].[SalesTerritoryHistory]  WITH CHECK 
    ADD CONSTRAINT [FK_SalesTerritoryHistory_SalesPerson_BusinessEntityID] 
    FOREIGN KEY([BusinessEntityID])
    REFERENCES [Sales].[SalesPerson] ([BusinessEntityID]);
    GO
    
    ALTER TABLE [Sales].[SalesTerritoryHistory] 
    CHECK CONSTRAINT [FK_SalesTerritoryHistory_SalesPerson_BusinessEntityID]
    GO
    
  3. 在脚本的 ALTER TABLE ... ADD CONSTRAINT 部分,修改新的外键约束并指定 NOT FOR REPLICATION 选项。 例如:

    ALTER TABLE [Sales].[SalesTerritoryHistory] 
    DROP CONSTRAINT [FK_SalesTerritoryHistory_SalesPerson_BusinessEntityID]
    GO
    
    ALTER TABLE [Sales].[SalesTerritoryHistory]  WITH CHECK 
    ADD CONSTRAINT [FK_SalesTerritoryHistory_SalesPerson_BusinessEntityID] 
    FOREIGN KEY([BusinessEntityID]) 
    REFERENCES [Sales].[SalesPerson] ([BusinessEntityID]) 
    NOT FOR REPLICATION; --added to disable constraint for replication
    GO
    
    ALTER TABLE [Sales].[SalesTerritoryHistory] 
    CHECK CONSTRAINT [FK_SalesTerritoryHistory_SalesPerson_BusinessEntityID]
    GO
    

后续步骤