更新时间:2025-12-12 GMT+08:00
分享

恢复所有触发器及外键

  1. 恢复目的端所有触发器及外键。

    • 恢复所有表级触发器
      DECLARE @sql NVARCHAR(MAX) = '';
      SELECT @sql = @sql + 'ENABLE TRIGGER ' + QUOTENAME(name) + ' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_id)) + '.' + QUOTENAME(OBJECT_NAME(parent_id)) + ';' + CHAR(13)
      FROM sys.triggers
      WHERE is_ms_shipped = 0  -- 排除系统触发器
      AND parent_class_desc = 'OBJECT_OR_COLUMN';  -- 只包含表级触发器
      EXEC sp_executesql @sql;

    • 恢复所有外键
      DECLARE @sql NVARCHAR(MAX) = '';
      SELECT @sql = @sql + 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + ' CHECK CONSTRAINT ' + QUOTENAME(name) + ';' + CHAR(13)
      FROM sys.foreign_keys;
      EXEC sp_executesql @sql;

  2. 恢复目的端禁用的库级触发器。

    ENABLE TRIGGER ALL ON DATABASE;

  3. 恢复源端服务层级。

    • 恢复源端数据服务为原层级。
      ALTER DATABASE smsa_mig
      MODIFY (EDITION = 'Standard', SERVICE_OBJECTIVE = 'S0'); -- 根据查询到的原数据库层级填写EDITION和SERVICE_OBJECTIVE

      可使用sql脚本查询是否已恢复(可能需要等待,若未恢复,重新执行恢复)。

      • 不支持CDC的Azure SQL Database需要执行此步骤。
      • 不支持开启CDC的级别有:Basic、Standard S0、Standard S1 和 Standard S2。
      • 不同版本的Azure SQL Database计费不同,用户需根据自身需要选择。
    • 查询数据库的原服务层级。
      SELECT 
          database_name = DB_NAME(),
          edition,
          service_objective
      FROM sys.database_service_objectives;

相关文档