Sql-Server

在 SQL Server 中使用觸發器

  • October 6, 2019

SQL 新手,我正在尋找一種方法來設置觸發器,當在表 A 上插入新行時,該觸發器將更新表 B。為了基本理解,這裡是我表中的一些列:

TABLE A:
+--------------+--------------+
|order_id (PK) |order_details |
+--------------+--------------+

Table B:
+-------------+--------------+-------------+
|item_id (PK) |item_details  |order_id (FK)|
+-------------+--------------+-------------+

我正在使用像這樣的儲存過程將數據插入表 A。顯然這個過程不起作用,但我想展示我的問題從哪裡開始,也許除了觸發器之外還有更好的方法。問題一直order_id在第二個 INSERT 中使用。

/*Parameters for the first Insert Statement*/
@customer_id INT,
@track_num NVARCHAR(50),
@pckg_num NUMERIC,

/*Parameters for the second Insert Statement*/
@manuf_name NVARCHAR(50),
@model_name NVARCHAR(50),
@qty NUMERIC,
@notes NVARCHAR(MAX)

/*Parameter I need for the second statement that doesn't exist until the first statement is committed*/
@order_id INT

AS

BEGIN
/*First Insert*/
INSERT INTO Orders
   (customer_id, track_num, pckg_num)
VALUES
   (@customer_id, @track_num, @pckg_num)
/*Second Insert*/
INSERT INTO Items
   (manuf, model, qty, notes, order_id)
VALUES
   (@manuf_name, @model_name, @qty, @notes, @order_id)

END

我想在同一個過程中觸發觸發器,然後使用從我的 Web 應用程序傳遞給過程的項目詳細資訊更新表 B,並包括表 A 中新創建的行中的 PK(order_id)作為表 B 中的 FK。

我嘗試過其他方式但沒有運氣,遇到了 Triggers 並認為這似乎是一個不錯的選擇。如果您對不同的方法有其他建議,請隨時提出!:) 提前致謝!

兩種主要方式,都不涉及觸發器(如果可以的話,通常最好避免觸發器) -

1)使用OUTPUT帶有第一條INSERT語句的子句來挑選生成的標識值:

DECLARE @NewOrder TABLE (order_id INT);

INSERT INTO Orders
   (customer_id, track_num, pckg_num)
OUTPUT
   inserted.order_id INTO @NewOrder
VALUES
   (@customer_id, @track_num, @pckg_num);

INSERT INTO Items
   (manuf_name, model_name, qty, notes, order_id)
SELECT
   @manuf_name, @model_name, @qty, @notes, order_id
FROM @NewOrder;
  1. 與其使用身份屬性聲明,不如Orders.order_id為其創建和使用序列對象(需要 SQL Server 2012 或更高版本):
CREATE SEQUENCE OrderIDSeq AS INT
   START WITH 1;

CREATE TABLE Orders (
   order_id INT
       PRIMARY KEY
       DEFAULT (NEXT VALUE FOR OrderIDSeq),
   //... other columns as before
);

GO

CREATE OR ALTER PROCEDURE AddOrder(
   @customer_id INT, @track_num NVARCHAR(50), @pckg_num NUMERIC,
   @manuf_name NVARCHAR(50), @model_name NVARCHAR(50),
   @qty NUMERIC, @notes NVARCHAR(MAX)) AS
BEGIN
   DECLARE @order_id INT = NEXT VALUE FOR OrderIDSeq;

   INSERT INTO Orders
       (order_id, customer_id, track_num, pckg_num)
   VALUES
       (@order_id, @customer_id, @track_num, @pckg_num);

   INSERT INTO Items
       (order_id, manuf_name, model_name, qty, notes)
   VALUES
       (@order_id, @manuf_name, @model_name, @qty, @notes);
END;

引用自:https://dba.stackexchange.com/questions/250373