Pergunta

O restrições de tabela executar na mesma transação?

Eu tenho uma transação com Read Committed nível de isolamento que insere algumas linhas em uma tabela. A tabela tem uma restrição sobre ele que chama uma função que, por sua vez, seleciona algumas linhas da mesma tabela.

Parece que a função é executado sem saber nada sobre a transação eo select nas linhas função retorna na tabela que estavam lá antes da operação.

Existe uma solução ou estou faltando alguma coisa? Obrigado.

Aqui estão os códigos para a transação e a restrição:

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
Foi útil?

Solução

Verifique as restrições não são aplicadas para operações de exclusão, consulte http: // MSDN .microsoft.com / en-us / library / ms188258.aspx

CONFIRA restrições não são validadas durante a instruções DELETE. Portanto, executar instruções DELETE em tabelas com certos tipos de verificação restrições podem produzir inesperada resultados.

Edit -. Para responder à sua pergunta sobre a solução alternativa, você pode usar um disparador de exclusão de rolo de volta se seus programas de chamada de função uma invariante é quebrado

Edit # 2 - @reticent, se você estiver adicionando linhas, em seguida, a função chamada pela restrição de verificação deve, de facto, ver as linhas. Se isso não aconteceu, restrições de verificação seria inútil. Aqui está um exemplo simples, você vai achar que as 2 primeiras inserções ter sucesso e a terceira falha como esperado:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top