是否表约束执行在同一事务中?

我有与插入表中的某些行读已提交隔离级别的事务。该表具有在其上的约束调用一个函数这反过来从相同的表中选择某些行。

它看起来像功能,而无需了解该事务,并在功能选择任何运行,其中在那里之前的交易表返回行。

有一种解决方法还是我缺少什么?感谢。

下面是用于交易和约束的代码:

insert into Treasury.DariaftPardakhtDarkhastFaktor
    (DarkhastFaktor, DariaftPardakht, Mablagh, CodeVazeiat, 
    ZamaneTakhsiseFaktor, MarkazPakhsh, ShomarehFaktor, User) 
values
    (@DarkhastFaktor, @DariaftPardakht, @Mablagh, @CodeVazeiat,
    @ZamaneTakhsiseFaktor, @MarkazPakhsh, @ShomarehFaktor, @User);


constraint expression (enforce for inserts and updates):
([Treasury].[ufnCheckDarkhastFaktorMablaghConstraint]([DarkhastFaktor])=(1))

ufnCheckDarkhastFaktorMablaghConstraint:

returns bit
as
begin
    declare @SumMablagh float
    declare @Mablagh    float

    select @SumMablagh = isnull(sum(Mablagh), 0)
    from Treasury.DariaftPardakhtDarkhastFaktor
    where DarkhastFaktor= @DarkhastFaktor

    select @Mablagh = isnull(MablaghKhalesFaktor, 0) 
    from Sales.DarkhastFaktor
    where DarkhastFaktor= @DarkhastFaktor

    if @Mablagh - @SumMablagh < -1
      return 0

    return 1
end
有帮助吗?

解决方案

检查约束不强制执行删除操作,请参阅 HTTP:// MSDN .microsoft.com / EN-US /库/ ms188258.aspx

  

CHECK约束不验证   在DELETE语句。因此,   执行表上的DELETE语句   某些类型的检查   限制可能会产生意外   结果

编辑 - 回答你的问题的解决方法,您可以使用删除触发器回滚,如果你的函数调用显示一个不变坏

编辑#2 - @reticent,如果再加入行通过检查约束称为其实应该看到行的功能。如果没有,检查约束将是无用的。下面是一个简单的例子,你会发现,第2个插入成功,并且按预期第三失败:

create table t1 (id int)
go
create function t1_validateSingleton () 
returns bit
as
begin
declare @ret bit
set @ret = 1
if exists (
    select count(*)
    from t1
    group by id
    having count(*) > 1
)
begin
    set @ret = 0
end
return (@ret)
end
go
alter table t1
add constraint t1_singleton
    check (dbo.t1_validateSingleton()=1)
go
insert t1 values (1)
insert t1 values (2)
insert t1 values (1)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top