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
¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top