Bagikan melalui


Memigrasikan Pemicu

Topik ini membahas pemicu DDL dan DML serta tabel yang dioptimalkan untuk memori.

Pemicu LOGON adalah pemicu yang ditentukan untuk diaktifkan pada peristiwa LOGON. Pemicu LOGON tidak berdampak pada tabel yang dioptimalkan untuk memori.

Pemicu DDL (Data Definition Language)

Pemicu DDL adalah pemicu yang ditentukan untuk diaktifkan ketika pernyataan CREATE, ALTER, DROP, GRANT, DENY, REVOKE, atau UPDATE STATISTICS dijalankan pada database atau server tempatnya ditentukan.

Anda tidak dapat membuat tabel yang dioptimalkan memori jika database atau server memiliki satu atau beberapa pemicu DDL yang ditentukan pada CREATE_TABLE atau grup peristiwa apa pun yang menyertakannya. Anda tidak dapat menghilangkan tabel yang dioptimalkan memori jika database atau server memiliki satu atau beberapa pemicu DDL yang ditentukan pada DROP_TABLE atau grup peristiwa apa pun yang menyertakannya.

Anda tidak dapat membuat prosedur tersimpan yang dikompilasi secara asli jika ada satu atau beberapa pemicu DDL pada CREATE_PROCEDURE, DROP_PROCEDURE, atau grup peristiwa apa pun yang menyertakan peristiwa tersebut.

Pemicu DML

Pemicu DML tidak dapat ditentukan pada tabel yang dioptimalkan memori. Namun, In-Memory OLTP memungkinkan Anda untuk mencapai efek yang mirip dengan pemicu DML jika Anda secara eksplisit menggunakan prosedur tersimpan untuk menyisipkan, memperbarui, atau menghapus data. Jika sistem Anda berisi kueri ad-hoc, konversikan untuk menggunakan prosedur tersimpan ini sebagai gantinya untuk mensimulasikan efek pemicu DML.

Bergantung pada peristiwa pemicu (FOR/AFTER atau INSTEAD OF), Anda dapat menyertakan konten pemicu dalam prosedur tersimpan yang sesuai yang melakukan INSERT, UPDATE, atau DELETE pada tabel tersebut. Misalnya, saat memigrasikan pemicu AFTER INSERT, Anda dapat mengubah prosedur tersimpan yang melakukan operasi penyisipan dengan menyertakan konten pemicu setelah pernyataan INSERT yang sesuai.

Anda dapat menggunakan prosedur tersimpan yang ditafsirkan atau prosedur tersimpan yang dikompilasi secara asli. Sebagian besar konstruksi Transact-SQL dalam prosedur tersimpan yang ditafsirkan dapat dijalankan pada tabel yang dioptimalkan memori. Namun, hanya subset konstruksi Transact-SQL yang didukung dalam prosedur tersimpan yang dikompilasi secara asli. Untuk informasi tentang dukungan Transact-SQL pada tabel yang dioptimalkan memori, lihat Mengakses tabel Memory-Optimized Menggunakan Transact-SQL yang Ditafsirkan. Untuk informasi tentang dukungan Transact-SQL dalam prosedur tersimpan yang dikompilasi secara asli, lihat KonstruksiTransact-SQL Tidak Didukung oleh OLTP In-Memory.

Berikut ini adalah contoh sederhana simulasi perilaku pemicu DML pada tabel yang dioptimalkan memori.

Database berisi objek berikut, berskrip sebagai pernyataan CREATE TABLE, CREATE TRIGGER, dan CREATE PROCEDURE:

CREATE TABLE OrderDetails  
(  
   OrderId int not null primary key,  
   ProductId int not null,  
   SalePrice money not null,  
   Quantity int not null,  
   Total money not null,  
   IsDeleted bit not null DEFAULT (0)  
)  
GO  
  
CREATE TRIGGER tr_order_details_insteadof_insert  
ON OrderDetails  
INSTEAD OF INSERT AS  
BEGIN  
   DECLARE @pid int, @qty_buy int, @qty_remain int  
   SELECT @pid = ProductId, @qty_buy = Quantity FROM inserted  
   SELECT @qty_remain = Quantity FROM Inventory WHERE ProductId = @pid  
   IF (@qty_remain <= @qty_buy)  
      THROW 51000, N'Insufficient inventory!', 1  
   ELSE  
   BEGIN  
      INSERT INTO dbo.OrderDetails (OrderId, ProductId, SalePrice, Quantity, Total)   
      SELECT OrderId, ProductId, SalePrice, Quantity, Total FROM inserted  
      UPDATE Inventory SET Quantity = Quantity - @qty_buy WHERE ProductId = @pid  
   END  
END  
GO  
  
CREATE TRIGGER tr_order_details_after_update  
ON OrderDetails  
AFTER UPDATE AS  
BEGIN  
   INSERT INTO UpdateNotifications (OrderId, UpdateTime) SELECT OrderId, GETDATE() FROM inserted     
END  
GO  
  
CREATE PROCEDURE sp_insert_order_details   
   @OrderId int, @ProductId int, @SalePrice money, @Quantity int, @total money  
AS BEGIN  
   INSERT INTO dbo.OrderDetails (OrderId, ProductId, SalePrice, Quantity, Total)  
   VALUES (@OrderId, @ProductId, @SalePrice, @Quantity, @total)  
END  
GO  
  
CREATE PROCEDURE sp_update_order_details_by_id  
   @OrderId int, @ProductId int, @SalePrice money, @Quantity int, @Total money  
AS BEGIN  
   UPDATE dbo.OrderDetails   
   SET ProductId = @ProductId, SalePrice = @SalePrice, Quantity = @Quantity, Total = @total  
   WHERE OrderId = @OrderId  
END  
GO  

Objek berikut secara fungsional setara dengan status pra-migrasi:

CREATE TABLE OrderDetails  
(  
   OrderId int not null PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1048576),  
   ProductId int not null,  
   SalePrice money not null,  
   Quantity int not null,  
   Total money not null,  
   IsDeleted bit not null DEFAULT (0)  
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)  
GO  
  
CREATE TABLE Inventory  
(  
   ProductId int not null PRIMARY KEY NONCLUSTERED,  
   Quantity int not null  
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)  
GO  
  
CREATE TABLE UpdateNotifications  
(  
   OrderId int not null,  
   UpdateTime datetime2 not null  
   CONSTRAINT pk_updateNotifications PRIMARY KEY NONCLUSTERED (OrderId, UpdateTime)  
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)  
GO  
  
CREATE PROCEDURE sp_insert_order_details   
   @OrderId int, @ProductId int, @SalePrice money, @Quantity int, @total money  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')  
   DECLARE @qty_remain int  
   SELECT @qty_remain = Quantity FROM dbo.Inventory WHERE ProductId = @ProductId  
   IF (@qty_remain <= @Quantity)  
      THROW 51000, N'Insufficient inventory!', 1  
   ELSE  
   BEGIN  
      INSERT INTO dbo.OrderDetails (OrderId, ProductId, SalePrice, Quantity, Total)   
      VALUES (@OrderId, @ProductId, @SalePrice, @Quantity, @total)  
      UPDATE dbo.Inventory SET Quantity = Quantity - @Quantity WHERE ProductId = @ProductId  
   END  
END  
GO  
  
CREATE PROCEDURE sp_update_order_details_by_id  
   @OrderId int, @ProductId int, @SalePrice money, @Quantity int, @Total money  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')  
   UPDATE dbo.OrderDetails   
   SET ProductId = @ProductId, SalePrice = @SalePrice, Quantity = @Quantity, Total = @total  
   WHERE OrderId = @OrderId  
   INSERT INTO dbo.UpdateNotifications (OrderId, UpdateTime) VALUES (@OrderId, GETDATE())  
END  
GO  

Lihat Juga

Migrasi ke Dalam Memori OLTP