Transacción de lectura confirmada con nivel de aislamiento y las restricciones de tabla
-
06-09-2019 - |
Pregunta
¿Tiene restricciones de tabla se ejecutan en la misma transacción?
Tengo una transacción con Read nivel de aislamiento cometidas, que introduce algunas filas de una tabla. La tabla tiene una restricción en él que se llama a una función que a su vez selecciona algunas filas de la misma tabla.
Parece que la función se ejecuta sin saber nada acerca de la transacción y la selección en la función devuelve filas de la tabla, que estaban allí antes de la transacción.
¿Hay una solución o me estoy perdiendo algo? Gracias.
Estos son los códigos de la transacción y la restricción:
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
Solución
Las restricciones de comprobación no se aplican en operaciones de borrado, consulta http: // MSDN .microsoft.com / es-es / library / ms188258.aspx
Las restricciones CHECK no se validan durante DELETE. Por lo tanto, la ejecución de sentencias DELETE en las tablas con ciertos tipos de verificación restricciones pueden producir inesperado resultados.
Editar - para responder a su pregunta en solución, puede utilizar un desencadenador de eliminación de revertir si su llamada a la función muestra una invariante se rompe
.Edición # 2 - @reticent, si va a agregar filas a continuación, la función llamada por la restricción de comprobación de hecho debería ver las filas. Si no fuera así, las restricciones de comprobación serían inútiles. Aquí está un ejemplo sencillo, se encuentra que las 2 primeras inserciones de tener éxito y la tercera falla como se esperaba:
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)