sql >> Database >  >> RDS >> Sqlserver

trigger en transacties op tijdelijke tafels

Ik denk dat je triggers niet begrijpt - het activeren van triggers wordt geassocieerd met de verklaring waaraan ze gerelateerd zijn, in plaats van wanneer de transactie wordt vastgelegd. Twee scripts:

Script 1:

create table T1 (
    ID int not null,
    Val1 varchar(10) not null
)
go
create table T2 (
    ID int not null,
    Val2 varchar(10) not null
)
go
create trigger T_T1_I
on T1
after insert
as
    insert into T2 (ID,Val2) select ID,Val1 from inserted
go
begin transaction
insert into T1 (ID,Val1)
select 10,'abc'
go
RAISERROR('Run script 2 now',10,1) WITH NOWAIT
WAITFOR DELAY '00:01:00'
go
commit

Script 2:

select * from T2 with (nolock)

Open twee verbindingen naar dezelfde DB, plaats één script in elke verbinding. Script uitvoeren 1. Wanneer het bericht "Script 2 nu uitvoeren" wordt weergegeven, schakelt u over naar de andere verbinding. U zult zien dat u niet-vastgelegde gegevens uit T2 kunt selecteren, ook al worden die gegevens door de trigger ingevoegd. (Dit houdt ook in dat de juiste vergrendelingen op T2 worden vastgehouden door script 1 totdat de trigger wordt vastgelegd).

Aangezien dit impliceert dat het equivalent van wat u vraagt, is om gewoon in de basistabel in te voegen en uw transactie open te houden, kunt u dat doen.

Als u de werkelijke vorm van de tafel voor gebruikers wilt verbergen, maakt u een weergave en schrijf triggers daarop om de basistabellen bij te werken. Zoals hierboven echter vermeld, zodra u een DML-bewerking tegen de weergave hebt uitgevoerd, zijn de triggers geactiveerd en houdt u vergrendelingen tegen de basistabel. Afhankelijk van het transactie-isolatieniveau van andere verbindingen, kunnen ze uw wijzigingen zien of worden geblokkeerd totdat de transactie wordt vastgelegd.



  1. Tel bezoeken van vandaag, deze week, vorige maand en totaal [MySQL-query]

  2. Toon dag of datum als kolom in mysql

  3. EntityFramework Code First Oracle

  4. Moet één sql-query uitvoeren op twee Oracle DB's in shellscript tegelijk en de gegevens exporteren naar afzonderlijke csv-bestanden