معاملة مع قراءة مستوى العزلة الملتزمين والقيود الجدول

StackOverflow https://stackoverflow.com/questions/915596

سؤال

هل يؤدي قيود الجدول في نفس الصفقة؟

لدي معاملة مع قراءة مستوى العزلة الملتزمة التي إدراج بعض الصفوف في جدول. يحتوي الجدول على قيود عليه يستدعي وظيفة تعمل بدوره بعض الصفوف من نفس الجدول.

يبدو أن الوظيفة تعمل دون معرفة أي شيء حول المعاملة والتحديد في الوظيفة إرجاع الصفوف في الجدول الموجود هناك قبل المعاملة.

هل هناك حل عبء أم أنا في عداد المفقودين أي شيء؟ شكرا.

فيما يلي رموز المعاملة والقيود:

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/library/ms188258.aspx.

لا يتم التحقق من صحة القيود أثناء عبارات حذف. لذلك، قد تنتج تنفيذ بيانات حذف على الجداول مع أنواع معينة من قيود الاختيار نتائج غير متوقعة.

تحرير - للإجابة على سؤالك على الحل البديل، يمكنك استخدام حذف الزناد للتراجع إذا أظهرت مكالمة عملك مكسورة ثابتة.

تحرير رقم 2 - Recent، إذا كنت تضيف صفوفا، فينبغي أن الوظيفة التي تم استدعاؤها بواسطة قيود الاختيار في الواقع رؤية الصفوف. إذا لم يكن الأمر كذلك، فسيكون التحقق من القيود عديمة الفائدة. فيما يلي مثال بسيط، ستجد أن أول 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