Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

wyzwalacz i transakcje na tabelach tymczasowych

Nie sądzę, że rozumiesz wyzwalacze — wyzwalanie wyzwalacza jest powiązane z oświadczeniem, z którym są powiązane, a nie z momentem zatwierdzenia transakcji. Dwa skrypty:

Skrypt 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

Skrypt 2:

select * from T2 with (nolock)

Otwórz dwa połączenia do tej samej bazy danych, umieść jeden skrypt w każdym połączeniu. Uruchom skrypt 1. Gdy wyświetli się komunikat „Uruchom skrypt 2 teraz”, przełącz się na inne połączenie. Zobaczysz, że możesz wybrać niezatwierdzone dane z T2, mimo że te dane są wstawiane przez wyzwalacz. (Oznacza to również, że odpowiednie blokady są utrzymywane na T2 przez skrypt 1 do momentu zatwierdzenia przez wyzwalacz).

Ponieważ oznacza to, że odpowiednikiem tego, o co prosisz, jest po prostu wstawienie do tabeli bazowej i pozostawienie otwartej transakcji, możesz to zrobić.

Jeśli chcesz ukryć przed użytkownikami rzeczywisty kształt tabeli, utwórz widok i napisz na tym wyzwalacze, aby zaktualizować tabele podstawowe. Jak wspomniano powyżej, gdy tylko wykonasz operację DML względem widoku, wyzwalacze zostaną uruchomione i będziesz utrzymywał blokady względem tabeli podstawowej. W zależności od poziomu izolacji transakcji innych połączeń, mogą one zobaczyć Twoje zmiany lub zostać zablokowane do momentu zatwierdzenia transakcji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Inny plan wykonania dla tej samej procedury składowanej

  2. Jak uzyskać pierwszą i ostatnią datę bieżącego roku?

  3. Ograniczenia SQL Server Express

  4. SQL LocalDB a SQL Server CE

  5. Klauzula SQL IN w procedurze składowanej