Sql-Server
在 SQL Server 中使用觸發器
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;
- 與其使用身份屬性聲明,不如
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;