Rumah pangkalan data tutorial mysql sql触发器怎么使用

sql触发器怎么使用

May 10, 2019 pm 05:33 PM
pencetus sql

sql中的触发器是对某个表进行操作时而触发的某种条件,可以用CREATE语句创建触发器,DROP语句删除触发器,ALTER语句禁用触发器等

sql触发器怎么使用

触发器

在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

CREATE TRIGGER tr_update_Stock   --自动采购触发器

ON T_Product

FOR update

AS

IF (update(Stock)) --判断stock字段是否更新

BEGIN

  --查询出库存低于下限的产品近一个月的消耗量

 --创建临时表

 IF object_id('[tempdb].[dbo].##table1') IS NOT NULL --判断临时表#tmp是否存在,存在则删除

    DROP TABLE ##table1

            SELECT * INTO ##table1 FROM (SELECT row_number() OVER (ORDER BY ProductID) AS rowNo,c.ZNumber - c.Stock AS purchaseNum,* FROM (

 SELECT  ProductID,SUM(s.Numbers) ZNumber,p.Stock,SUM(s.OutMoney) ZMoney,p.Price

 FROM [dbo].[T_StorageOut] t inner join[dbo].[T_StorageRelation] s

 ON t.StorageOutID=s.StorageOutID inner join T_Product p ON s.ProductID=p.Id

 WHERE t.MakerTime between Convert(VARCHAR,DATEADD(MONTH,-1,GETDATE()),23) and Convert(VARCHAR,GETDATE(),23) and ProductID in (SELECT Id FROM V_ProductSupplierInfo where (Stock-StockLowerLimit)<0)

 GROUP BY ProductID,p.Stock,p.Price) c) ddd

--计算用参数

DECLARE @purchaseNum INT,@Price NVARCHAR(50),@totalMoney NVARCHAR(50),@ZpurchaseTotal INT --采购数量,单价,总金额,总数量

SELECT @totalMoney = 0,@purchaseNum = 0,@Price = 0,@ZpurchaseTotal=0

 --采购单所需参数

  DECLARE @PurchaseNumber NVARCHAR(50),@DopurchaseId INT,@DopurchaseTime NVARCHAR(200),@PurchaseTotal INT,@PurchasePrice NVARCHAR(200),@PurchaseState INT,@PurchaseType INT

   SET @PurchaseNumber='JH'+replace(replace(replace(convert(VARCHAR,getdate(),120),'-',''),' ',''),':','') --进货单号JH20171031092322

--采购单详情所需参数 (产品id,产品采购价格)

  DECLARE @StockProductId INT,@DPurchasePrice NVARCHAR(20)

--循环用参数

DECLARE @curIndex INT,@rowCount INT

--判断用参数

DECLARE @OTCount INT,@PTCount INT   

SET @curIndex = 1

SELECT @rowCount = COUNT(1) FROM ##table1

IF(@rowCount>0)

BEGIN

   WHILE @curIndex <= @rowCount

   BEGIN

      --查询出第一行数据的采购数量,单价,产品id

      SELECT @purchaseNum = purchaseNum,@Price = Price,@StockProductId =ProductID FROM ##table1 WHERE rowNo = @curIndex

       --采购总金额

      SET @totalMoney = @totalMoney + @purchaseNum * CONVERT (INT,@price)

      --采购总数量

      SET @ZpurchaseTotal =@ZpurchaseTotal + @purchaseNum 

      --单个产品的采购金额

      SET @DPurchasePrice=@purchaseNum * CONVERT (INT,@price)

      IF object_id('[tempdb].[dbo].#PTable') IS NOT NULL --判断临时表#tmp是否存在,存在则删除

       DROP TABLE #PTable

      IF object_id('[tempdb].[dbo].#OTable') IS NOT NULL --判断临时表#tmp是否存在,存在则删除

       DROP TABLE #OTable      

      --根据产品id查询出包含该产品的采购单已全部审批

      SELECT * INTO #PTable FROM (SELECT PurchaseState FROM [dbo].[T_Purchase_Order] WHERE PurchaseNumber in(SELECT PurchaseOrderId FROM  [dbo].[T_Purchase_OrderDetails] WHERE StockProductId=@StockProductId) and PurchaseState=0) AS a

      --根据产品id查询出包含该产品的订单已全部入库

      SELECT * INTO #OTable FROM (SELECT OrderState FROM T_Order WHERE OrderNumber in(SELECT OrderNumber FROM  T_OrderDetails WHERE ProductId=@StockProductId) and OrderState=0) AS c

      SELECT  @PTCount = COUNT(1) FROM #PTable

      SELECT  @OTCount = COUNT(1) FROM #OTable

          IF (@PTCount=0) --已全部审批

          BEGIN

             IF(@OTCount=0) --=0表示包含该产品的订单均已入库,可以生成新的

              BEGIN

               INSERT INTO [dbo].[T_Purchase_OrderDetails] VALUES(@PurchaseNumber,@StockProductId,@purchaseNum,@DPurchasePrice)

              END

          END

      SET @curIndex = @curIndex + 1

   END

END

  set @DopurchaseId = 16646 --自动生成

  set @DopurchaseTime=Convert(NVARCHAR,getdate(),23)   --当前时间 2017-10-31

  set @PurchaseTotal =@ZpurchaseTotal

  set @PurchasePrice =@totalMoney

  set @PurchaseState =0 --未审核

  set @PurchaseType = 2 --自动生成

  --变量赋值完成,对采购单做添加操作

   IF (@PTCount=0)

   BEGIN

    INSERT INTO T_Purchase_Order VALUES(@PurchaseNumber,@DopurchaseId,@DopurchaseTime,@PurchaseTotal,@PurchasePrice,@PurchaseState,@PurchaseType)

   END

END

Salin selepas log masuk

这是一个自动采购的触发器,主要需要注意的触发条件,以及临时表的作用。

触发器的使用

创建触发器

1

CREATE TRIGGER tr_update_Stock

Salin selepas log masuk

删除触发器

1

DROP  TRIGGER tr_update_Stock

Salin selepas log masuk

禁用

1

2

ALTER TABLE trig_example DISABLE TRIGGER trig1

GO

Salin selepas log masuk

恢复

1

2

ALTER TABLE trig_example ENABLE TRIGGER trig1

GO

Salin selepas log masuk

禁用某个表上的所有触发器

1

ALTER TABLE 你的表 DISABLE TRIGGER all

Salin selepas log masuk

启用某个表上的所有触发器

1

ALTER TABLE 你的表 enable TRIGGER all

Salin selepas log masuk

禁用所有表上的所有触发器

1

exec sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all'

Salin selepas log masuk

启用所有表上的所有触发器

1

exec sp_msforeachtable 'ALTER TABLE ? enable TRIGGER all'

Salin selepas log masuk


Atas ialah kandungan terperinci sql触发器怎么使用. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Kurangkan penggunaan memori MySQL di Docker Kurangkan penggunaan memori MySQL di Docker Mar 04, 2025 pm 03:52 PM

Kurangkan penggunaan memori MySQL di Docker

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table? Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table? Mar 19, 2025 pm 03:51 PM

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table?

Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama Mar 04, 2025 pm 04:01 PM

Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama

Apa itu SQLite? Gambaran Keseluruhan Komprehensif Apa itu SQLite? Gambaran Keseluruhan Komprehensif Mar 04, 2025 pm 03:55 PM

Apa itu SQLite? Gambaran Keseluruhan Komprehensif

Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin) Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin) Mar 04, 2025 pm 03:54 PM

Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin)

Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah Mar 04, 2025 pm 03:49 PM

Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah

Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)? Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)? Mar 18, 2025 pm 12:00 PM

Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)?

Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL? Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL? Mar 18, 2025 pm 12:01 PM

Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL?

See all articles