Mysql 触发器分分快三全天计划网站

作者:分分快三全天计划网站

  1.    怎么着使用sql获取当前session 客户名和机器名

Select CURRENT_USER,Host_name()

UPDATE触发器

 update触发器中NEW.column代表更新后的值,OLD.column代表更新前的值。

#UPDATE触发器
DELIMITER $$
CREATE TRIGGER TR_Product_updat AFTER UPDATE ON Product FOR EACH ROW
BEGIN
    IF NEW.price<>OLD.price THEN#当价格发生变化时生成一条价格变动的日志信息插入Product_log表 
    INSERT INTO Product_log(productid,newprice,oldprice) VALUES(NEW.proID,NEW.price,OLD.price);
    ELSE IF  NEW.type<>OLD.type THEN#当产品类型发生改变时更新ProductType表对应的类别 
       UPDATE ProductType
       SET amount=amount (SELECT price FROM Product WHERE proID=NEW.proid)
       WHERE ID=NEW.type;
       UPDATE  ProductType
       SET amount=amount-(SELECT price FROM Product WHERE proID=NEW.proid)
       WHERE ID=OLD.type;
       END IF;
    END IF;

END $$  
DELIMITER ;

测量试验数据

UPDATE Product
SET price=40.00
WHERE proid=4;

分分快三全天计划网站 1

UPDATE Product
SET type=2
WHERE proid=4;

分分快三全天计划网站 2

触发器完整代码

ALTER TRIGGER dbo.DimTest_AdutitTriger
   ON  dbo.DimTest
   AFTER INSERT,DELETE,UPDATE
AS
BEGIN
                SET NOCOUNT ON;
                declare @tbName varchar(256)
                SELECT @tbName = ‘dbo.DimTest’
                DECLARE @action as varchar(20), @Count int = 0 ;
    SET @action = 'INSERT'; -- Set Action to Insert by default.

    IF EXISTS(SELECT * FROM DELETED)
    BEGIN
        SET @action =
            CASE
                WHEN EXISTS(SELECT * FROM INSERTED) THEN 'UPDATE' -- Set Action to Updated.
                ELSE 'DELETE' -- Set Action to Deleted.      
            END
    END
    ELSE
        IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; -- Nothing updated or inserted.
                IF ( @action = 'INSERT' or @action ='UPDATE')
                BEGIN
                                set @Count = (select count(*) from INSERTED)
                END
                IF  @action = 'DELETE'
                BEGIN
                                set @Count = (select count(*) from DELETED)
                END
                insert into dbo.AuditTable
                select getdate(),CURRENT_USER,Host_name(),null,@tbName,'dim',@action,@Count
END
GO

DELETE触发器

DELIMITER $$
CREATE TRIGGER TR_product_delete BEFORE DELETE ON product FOR EACH row
BEGIN
     UPDATE producttype
     SET amount=amount-(SELECT price FROM product WHERE proID=OLD.proID)
     WHERE ID=OLD.type;
END $$
DELIMITER ;

 测量试验数据

DELETE FROM product WHERE proID=4;

分分快三全天计划网站 3

 

到家语句

#NEW.Column:获取新插入的列值,OLD.column:获取更新列的旧值

#产品表
CREATE TABLE Product
(proID INT AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT '商品表主键',
price DECIMAL(10,2) NOT NULL COMMENT '商品价格',
type INT NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)',
dtime DATETIME NOT NULL COMMENT '创建时间'
)AUTO_INCREMENT=1 COMMENT='商品表';

#商品类别汇总表
CREATE TABLE ProductType
(ID INT NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)',
amount INT NOT NULL COMMENT '每种类别商品总金额',
PRIMARY KEY (ID)
)COMMENT='商品类别资金汇总表';

#产品价格变动表
CREATE TABLE Product_log
(ID INT AUTO_INCREMENT NOT NULL COMMENT '主键',
productid INT NOT NULL COMMENT '产品id',
newprice DECIMAL(10,2) NOT NULL COMMENT '更改后的价格',
oldprice DECIMAL(10,2) NOT NULL COMMENT '更改前的价格',
remark VARCHAR(20) NOT NULL COMMENT '价格更改备注',
dtime DATETIME NOT NULL DEFAULT current_timestamp COMMENT '记录插入的时间',
PRIMARY KEY(ID)
)AUTO_INCREMENT=1 COMMENT='产品价格变动表';



#插入测试数据

INSERT INTO ProductType VALUES(1,0.00),(2,0.00),(3,0.00);


DELIMITER $$
CREATE TRIGGER TR_Product_insert AFTER INSERT ON Product FOR EACH ROW
BEGIN
     UPDATE ProductType
     SET amount=amount NEW.price
     WHERE ID=NEW.type;
END $$
DELIMITER ;


#UPDATE触发器
DROP TRIGGER IF EXISTS TR_Product_updat;
DELIMITER $$
CREATE TRIGGER TR_Product_updat AFTER UPDATE ON Product FOR EACH ROW
BEGIN
    IF NEW.price>OLD.price THEN#当价格发生变化时生成一条价格变动的日志信息插入Product_log表 
        INSERT INTO Product_log(productid,newprice,oldprice,remark) VALUES(NEW.proID,NEW.price,OLD.price,'加价');
        UPDATE ProductType
        SET amount=amount NEW.price-OLD.price
        WHERE ID=NEW.type;
        ELSE IF NEW.price<OLD.price THEN
            INSERT INTO Product_log(productid,newprice,oldprice,remark) VALUES(NEW.proID,NEW.price,OLD.price,'减价');
            UPDATE ProductType
            SET amount=amount-OLD.price NEW.price
            WHERE ID=NEW.type;
            END IF;
    END IF;        
    IF NEW.type<>OLD.type THEN#当产品类型发生改变时更新ProductType表对应的类别
    INSERT INTO Product_log(productid,newprice,oldprice,remark) VALUES(NEW.proID,NEW.price,OLD.price,'产品类型变更');
       UPDATE ProductType
       SET amount=amount NEW.price
       WHERE ID=NEW.type;
       UPDATE  ProductType
       SET amount=amount-NEW.price
       WHERE ID=OLD.type;
    END IF;


END $$  
DELIMITER ;

#DELETE触发器
DELIMITER $$
CREATE TRIGGER TR_product_delete BEFORE DELETE ON product FOR EACH row
BEGIN
     UPDATE producttype
     SET amount=amount-(SELECT price FROM product WHERE proID=OLD.proID)
     WHERE ID=OLD.type;
END $$
DELIMITER ;


INSERT INTO product(price,type,dtime) VALUES(10.00,1,NOW()),(10.00,1,NOW()),(10.00,1,NOW()),(10.00,2,NOW()),(10.00,3,NOW()),(10.00,4,NOW());

#测试数据
UPDATE product
SET price=30
WHERE proID=5;

#测试价格变动
UPDATE product
SET price=20
WHERE proID=5;

#测试产品类型变动
UPDATE product
SET type=2
WHERE proID=5;

 

 

  2.    如何在表触发器中拿走当前表名称

SELECT OBJECT_SCHEMA_NAME( parent_id )   '.'   OBJECT_NAME( parent_id )  FROM sys.triggers

 

标签:NEW.COLUMN,OLDCOLUMN

除开表触发器的基本知识,本篇还动用了一下知识点。

步骤

 

#产品表
CREATE TABLE Product
(proID INT AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT '商品表主键',
price DECIMAL(10,2) NOT NULL COMMENT '商品价格',
type INT NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)',
dtime DATETIME NOT NULL COMMENT '创建时间'
)AUTO_INCREMENT=1 COMMENT='商品表';

#商品类别汇总表
CREATE TABLE ProductType
(ID INT NOT NULL COMMENT '商品类别(0生鲜,1食品,2生活)',
amount INT NOT NULL COMMENT '每种类别商品总金额',
PRIMARY KEY (ID)
)COMMENT='商品类别资金汇总表';

#产品价格变动表
CREATE TABLE Product_log
(ID INT AUTO_INCREMENT NOT NULL COMMENT '主键',
productid INT NOT NULL COMMENT '产品id',
newprice DECIMAL(10,2) COMMENT '更改后的价格',
oldprice DECIMAL(10,2) COMMENT '更改前的价格',
PRIMARY KEY(ID)
)AUTO_INCREMENT=1 COMMENT='产品价格变动表';

#插入测试数据

INSERT INTO ProductType VALUES(1,0.00),(2,0.00),(3,0.00);

 

总结

文章在INSTEXC60和UPDATE触发器中用的是AFTERubicon方式的接触,AFTE昂科拉触发正是在实践命令操作之后试行触发操作;在DELETE触发器中用到的是BEFORE触发,BEFORE触发正是在进行操作命令以前实行触发操作。

 

 小说要是对我们有帮扶,请帮忙引荐,多谢!!!

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

 

---苏醒内容停止---

INSERT触发器

insert触发器独有NEW.Column.

在Product表中确立INSERT触发器,当往Product表中插入产物时,更新ProductType表对应的归类商品价位。

DELIMITER $$
CREATE TRIGGER TR_Product_insert AFTER INSERT ON Product FOR EACH ROW
BEGIN
     UPDATE ProductType
     SET amount=amount NEW.price
     WHERE ID=NEW.type;
END $$
DELIMITER ;

布置测量检验数据

INSERT INTO Product(price,type,dtime) VALUES(10.00,1,NOW()),(10.00,1,NOW()),(10.00,2,NOW()),(10.00,3,NOW());

SELECT * FROM Product;

SELECT * FROM ProductType;

分分快三全天计划网站 4

概述  

作品内容主要汇报的是insert,update,delete触发器,如若以前有利用此外产品数据库成品或许有的地点供给静心,比如sqlserver使用inserted获取新插入的值,而mysql是应用NEW.COLUMN来拿到。

只能对长久表成立触发器,不能在有的时候表中开创触发器;同三个表不可能存在多少个相通类别的触发器,比方不能够存在五个insert触发器,对应update触发器能够经过IF 分化的字段执行差异样的操作。

时下测量试验版本:mysql 5.6.21。

目录

  •  概述
  •  步骤
    •  INSERT触发器
    •  UPDATE触发器
    •  DELETE触发器
  •  总结

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 所有随笔 软件工程 MySQL 基础