无法更改 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 查询创建一个,非常实际上,简单的东西。为工作找到合适的工具是比较复杂的部分。
希望这对遇到同样问题的人有所帮助。
我有这个脚本来存储函数:
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 查询创建一个,非常实际上,简单的东西。为工作找到合适的工具是比较复杂的部分。
希望这对遇到同样问题的人有所帮助。