質問

テーブル制約は、同じトランザクション内で実行していますか?

私は、テーブル内のいくつかの行を挿入コミット読取り分離レベルでのトランザクションを持っています。表には、今度は、同じテーブルからいくつかの行を選択した関数を呼び出すことに制約があります。

関数は、関数内のトランザクションと選択については何も知らずに走るように見えますが、取引前にしたテーブルの行を返します。

回避策はありますか私は何をしないのですか?おかげます。

ここでは、トランザクションや制約のコードがあります:

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