معاملة مع قراءة مستوى العزلة الملتزمين والقيود الجدول
-
06-09-2019 - |
سؤال
هل يؤدي قيود الجدول في نفس الصفقة؟
لدي معاملة مع قراءة مستوى العزلة الملتزمة التي إدراج بعض الصفوف في جدول. يحتوي الجدول على قيود عليه يستدعي وظيفة تعمل بدوره بعض الصفوف من نفس الجدول.
يبدو أن الوظيفة تعمل دون معرفة أي شيء حول المعاملة والتحديد في الوظيفة إرجاع الصفوف في الجدول الموجود هناك قبل المعاملة.
هل هناك حل عبء أم أنا في عداد المفقودين أي شيء؟ شكرا.
فيما يلي رموز المعاملة والقيود:
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)