sql >> Databasteknik >  >> RDS >> Sqlserver

trigger och transaktioner på temporära tabeller

Jag tror inte att du förstår triggers – triggerfiring är associerat med påståendet att de är relaterade till, snarare än när transaktionen genomförs. Två skript:

Skript 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

Skript 2:

select * from T2 with (nolock)

Öppna två anslutningar till samma DB, lägg ett script i varje anslutning. Kör skript 1. När meddelandet "Kör skript 2 nu" visas, växla till den andra anslutningen. Du kommer att se att du kan välja oengagerad data från T2, även om denna data infogas av utlösaren. (Detta innebär också att lämpliga lås hålls på T2 av skript 1 tills triggern commits).

Eftersom detta innebär att motsvarigheten till vad du ber om är att bara infoga i bastabellen och hålla din transaktion öppen, kan du göra det.

Om du vill dölja tabellens faktiska form för användare, skapa en vy och skriv triggers på det för att uppdatera bastabellerna. Men som nämnts ovan, så snart du har utfört en DML-operation mot vyn, kommer triggarna att ha utlösts, och du kommer att hålla lås mot basbordet. Beroende på transaktionsisoleringsnivån för andra anslutningar kan de se dina ändringar eller blockeras tills transaktionen genomförs.



  1. SQL Server trunkering och 8192 begränsning

  2. Hur importerar man tabeller med saknade värden?

  3. Hur man hanterar en tabellkolumn med ett reserverat SQL-sökord?

  4. Varför MySQL konverterar automatiskt strängar till siffror?