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

Czy aktualizacja wyzwala zdarzenie INSERT, ponieważ wszystkie aktualizacje są DELETE + (re)INSERT w SQL Server?

Aktualizacja nigdy nie wyzwala zdarzenia wstawiania, nawet jeśli jest fizycznie zaimplementowana jako wstawianie/usuwanie, ponieważ logicznie operacja jest nadal UPDATE .

W przyjętej odpowiedzi znajduje się zdanie, które nie jest do końca prawdziwe, jeśli odnosi się do logicznych aktualizacji kolumny klucza.

Nie dotyczy to aktualizacji wielowierszowej względem unikalnego indeksu. Dla tych SQL Server daje plan z podziel/sortuj/zwiń operatorów. W poniższym przykładzie 9 operacji aktualizacji zostanie przekonwertowanych na 1 usunięcie, 8 aktualizacji i wstawienie.

CREATE TABLE TestingUpdate7 (
ID INT,
SomeString CHAR(50)
)

CREATE UNIQUE CLUSTERED INDEX idx_ID ON TestingUpdate7 (ID)

INSERT INTO TestingUpdate7 (ID, SomeString)
VALUES
(1,'One'),(2,'Two'),(3,'Three'),(4,'Four'),
(5,'Five'),(6,'Six'),(7,'Seven'),(8,'Eight'),(9,'Nine')

CHECKPOINT -- truncate the log, DB is in simple recovery.

UPDATE TestingUpdate7
SET  ID +=1

SELECT Operation, Context, AllocUnitName 
FROM fn_dblog(NULL, NULL) 

Zwroty

+-----------------+--------------------+---------------------------+
|    Operation    |      Context       |       AllocUnitName       |
+-----------------+--------------------+---------------------------+
| LOP_BEGIN_CKPT  | LCX_NULL           | NULL                      |
| LOP_XACT_CKPT   | LCX_BOOT_PAGE_CKPT | NULL                      |
| LOP_END_CKPT    | LCX_NULL           | NULL                      |
| LOP_BEGIN_XACT  | LCX_NULL           | NULL                      |
| LOP_DELETE_ROWS | LCX_MARK_AS_GHOST  | dbo.TestingUpdate7.idx_ID |
| LOP_SET_BITS    | LCX_PFS            | dbo.TestingUpdate7.idx_ID |
| LOP_MODIFY_ROW  | LCX_CLUSTERED      | dbo.TestingUpdate7.idx_ID |
| LOP_MODIFY_ROW  | LCX_CLUSTERED      | dbo.TestingUpdate7.idx_ID |
| LOP_MODIFY_ROW  | LCX_CLUSTERED      | dbo.TestingUpdate7.idx_ID |
| LOP_MODIFY_ROW  | LCX_CLUSTERED      | dbo.TestingUpdate7.idx_ID |
| LOP_MODIFY_ROW  | LCX_CLUSTERED      | dbo.TestingUpdate7.idx_ID |
| LOP_MODIFY_ROW  | LCX_CLUSTERED      | dbo.TestingUpdate7.idx_ID |
| LOP_MODIFY_ROW  | LCX_CLUSTERED      | dbo.TestingUpdate7.idx_ID |
| LOP_MODIFY_ROW  | LCX_CLUSTERED      | dbo.TestingUpdate7.idx_ID |
| LOP_INSERT_ROWS | LCX_CLUSTERED      | dbo.TestingUpdate7.idx_ID |
| LOP_COMMIT_XACT | LCX_NULL           | NULL                      |
+-----------------+--------------------+---------------------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwrócić wiele zestawów wyników za pomocą SqlCommand?

  2. Count (Distinct ([wartość)) OVER (partycjonowanie według) w SQL Server 2008

  3. Znajdź wszystkie tabele zawierające kolumnę o określonej nazwie - MS SQL Server

  4. Usuń pojedynczy znak z pola varchar SQL Server 2008

  5. Korzystanie z typu danych sql i EF4