none
求助:SQL 中关于触发器的问题 RRS feed

  • 问题

  • 求助:

    在业务系统中。入库或者出库操作会引起库存的变化。实际在项目开发过程中。具体到SQL中是怎么实现的?利用触发器吗?

    比如,我有入库表、库存表、出库表;

    假设:入库操作。入库单确认后,库存就增加。那这个过程中。利用触发器是怎么实现的呢?希望有个具体的例子。谢谢!


    hi,this is paul!
    2011年8月7日 9:27

答案

  • 依照你的需求,我做了一個簡單的範例,有興趣可以參考看看,希望對你有幫助,這個範例用到的是DML Trigger,於入庫和出庫時更新庫存表。

    PS:以下程式碼只是簡單示意,尚有許多地方須根據實際需求進行調整。

    use Northwind
    go
    
    --庫存
    if exists (select * from sys.objects where type = 'U' and name='t1')
    	drop table t1
    go
    
    create table t1
    (
    	ProdID int not null
    	,Amount int not null
    )
    go
    
    --出庫
    if exists (select * from sys.objects where type = 'U' and name='t2')
    	drop table t2
    go
    
    create table t2
    (
    	ProdID int not null
    	,Amount int not null
    )
    go
    --入庫
    if exists (select * from sys.objects where type = 'U' and name='t3')
    	drop table t3
    go
    
    create table t3
    (
    	ProdID int not null
    	,Amount int not null
    )
    go
    
    --當入庫時觸發
    create trigger trg_insert_t3 on t3
    after insert
    as
    	if exists (select * from t1 where ProdID = (select ProdID from inserted))
    		update t1
    		set Amount = Amount + (select Amount from inserted)
    		where ProdID = (select ProdID from inserted)
    	else
    		insert into t1
    		select ProdID,Amount from inserted
    	
    go
    
    --當出庫時觸發
    create trigger trg_insert_t2 on t2
    after insert
    as
    	if exists (select * from t1 where ProdID = (select ProdID from inserted))
    		update t1
    		set Amount = Amount - (select Amount from inserted)
    		where ProdID = (select ProdID from inserted)
    	
    go
    
    --入庫
    insert into t3 values(1,10)
    insert into t3 values(2,5)
    insert into t3 values(1,3)
    
    --出庫
    insert into t2 values (1,5)
    insert into t2 values(2,2)
    
    select * from t1
    select * from t2
    select * from t3
    
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 Specialme 2011年8月7日 14:02
    2011年8月7日 10:26

全部回复

  • 依照你的需求,我做了一個簡單的範例,有興趣可以參考看看,希望對你有幫助,這個範例用到的是DML Trigger,於入庫和出庫時更新庫存表。

    PS:以下程式碼只是簡單示意,尚有許多地方須根據實際需求進行調整。

    use Northwind
    go
    
    --庫存
    if exists (select * from sys.objects where type = 'U' and name='t1')
    	drop table t1
    go
    
    create table t1
    (
    	ProdID int not null
    	,Amount int not null
    )
    go
    
    --出庫
    if exists (select * from sys.objects where type = 'U' and name='t2')
    	drop table t2
    go
    
    create table t2
    (
    	ProdID int not null
    	,Amount int not null
    )
    go
    --入庫
    if exists (select * from sys.objects where type = 'U' and name='t3')
    	drop table t3
    go
    
    create table t3
    (
    	ProdID int not null
    	,Amount int not null
    )
    go
    
    --當入庫時觸發
    create trigger trg_insert_t3 on t3
    after insert
    as
    	if exists (select * from t1 where ProdID = (select ProdID from inserted))
    		update t1
    		set Amount = Amount + (select Amount from inserted)
    		where ProdID = (select ProdID from inserted)
    	else
    		insert into t1
    		select ProdID,Amount from inserted
    	
    go
    
    --當出庫時觸發
    create trigger trg_insert_t2 on t2
    after insert
    as
    	if exists (select * from t1 where ProdID = (select ProdID from inserted))
    		update t1
    		set Amount = Amount - (select Amount from inserted)
    		where ProdID = (select ProdID from inserted)
    	
    go
    
    --入庫
    insert into t3 values(1,10)
    insert into t3 values(2,5)
    insert into t3 values(1,3)
    
    --出庫
    insert into t2 values (1,5)
    insert into t2 values(2,2)
    
    select * from t1
    select * from t2
    select * from t3
    
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 Specialme 2011年8月7日 14:02
    2011年8月7日 10:26
  • 非常感谢!
    hi,this is paul!
    2011年8月7日 14:02
  • 追问:

    那请问,我制单的时候,要在入库单中插入新记录,但是还还要等入库单确认以后,才能计算为库存。不能说是我插入茹苦中中记录以后,就马上计算库存的。

    那这个插入或者更新是不是要有条件的?


    hi,this is paul!
    2011年8月8日 4:08
  • I think it depends on business logic, should check with your end user.
    2011年8月8日 14:02
  • 追问:

    那请问,我制单的时候,要在入库单中插入新记录,但是还还要等入库单确认以后,才能计算为库存。不能说是我插入茹苦中中记录以后,就马上计算库存的。

    那这个插入或者更新是不是要有条件的?


    hi,this is paul!

    如同rmiao所說的,你上述所說的理論上都是可以實作的,就看你的商業邏輯是如何計算庫存。

    我所提供的範例是以ProdID為計算庫存的依據,相信在你的實際案例中應該也是會有一個類似的欄位來決定入庫或出庫的項目,如此才可以計算庫存量。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月8日 23:13