无法更改 sql 对象,因为它被默认约束引用

Can't alter sql object because it's being referenced by default constraint

我有这个脚本来存储函数:

CREATE OR ALTER FUNCTION order.GetSupplierIdBySystemName(@SysName AS VARCHAR(100))
RETURNS INT
AS
BEGIN
    DECLARE @SId AS INT
    SELECT @SId = Id FROM [hyper].[Supplier] WHERE SystemName = @SysName
    RETURN @SId
END

然后我在默认约束中使用它:

ALTER TABLE [h360_order].[ExternalStore] 
ADD SupplierId INT NOT NULL CONSTRAINT DF_ExternalStore_SupplierId 
DEFAULT(order.GetSupplierIdBySystemName('Name'));

现在 CREATE OR ALTER 是为了幂等,但是当 运行 脚本第二次出现错误时:

SQL Error [3729][S0003]: Cannot ALTER 'order.GetSupplierIdBySystemName' because it is being referenced by object 'DF_ExternalStore_SupplierId'.

IF EXISTS... 似乎有可能,但我无法在创建函数的脚本中使用它。

如何在保持幂等性的同时彻底修复它?

删除约束,更改函数,重新创建约束。


ALTER TABLE [h360_order].[ExternalStore] DROP CONSTRAINT DF_ExternalStore_SupplierId ;


ALTER FUNCTION order.GetSupplierIdBySystemName(@SysName AS VARCHAR(100))
RETURNS INT
AS
BEGIN
    DECLARE @SId AS INT
    SELECT @SId = Id FROM [hyper].[Supplier] WHERE SystemName = @SysName
    RETURN @SId
END;


ALTER TABLE [h360_order].[ExternalStore] 
ADD CONSTRAINT DF_ExternalStore_SupplierId 
DEFAULT(order.GetSupplierIdBySystemName('Name')) FOR [SupplierId];

我最终在 IF 语句中使用了 sp_executesql 存储过程:

IF OBJECT_ID('order.GetSupplierIdBySystemName') IS NULL
BEGIN

DECLARE @sqlstatement NVARCHAR(1000);
SET @sqlstatement = 
    'CREATE FUNCTION h360_order.GetSupplierIdBySystemName(@SysName AS VARCHAR(100))
    RETURNS INT
    AS
    BEGIN
        DECLARE @SId AS INT
        SELECT @SId = Id FROM [hyper].[Supplier] WHERE SystemName = @SysName
        RETURN @SId
    END'
    
    EXEC sp_executesql @sqlstatement;                  
END 

所以基本上它所做的是检查存储函数是否存在,如果不存在,它会通过存储过程 sp_executesql 使用存储在 @sqlstatement 中的 sql 查询创建一个,非常实际上,简单的东西。为工作找到合适的工具是比较复杂的部分。

希望这对遇到同样问题的人有所帮助。