mysql 触发器+存储过程


本文是工作的一些记录,并不适合学习和参考。







select max(id) 应该用last_insert_id()代替。

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = '表名'      #用于查找某个表的最后一个主键值


p_policy_base表是策略的基础信息表,用于存储策略的基础信息。

p_timepolicy是时间策略表,表示一条具体的时间策略,与p_policy_base通过sn及fid形成非约束关联关系。

c_configs存储一些配置信息。


需求:

1.当对p_timepolicy执行insert操作时,自动向p_ploicy_base插入一条相关记录。

2.当对p_timepolicy执行update操作时,自动更新p_policy_base相应记录。


CREATE TABLE `c_configs` (
  `configid` int(11) NOT NULL AUTO_INCREMENT,
  `configtype` int(11) DEFAULT NULL,
  `configkey` varchar(32) DEFAULT NULL,
  `configvalue` varchar(150) DEFAULT NULL,
  PRIMARY KEY (`configid`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;


CREATE TABLE `p_policy_base` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `sn` varchar(20) NOT NULL DEFAULT '' COMMENT '策略编码',
  `name` varchar(60) NOT NULL DEFAULT '' COMMENT '策略名',
  `des` varchar(255) DEFAULT NULL COMMENT '短描述',
  `fid` int(11) DEFAULT '0' COMMENT '关联到具体策略表的id',
  `domainid` int(11) DEFAULT '0' COMMENT '域id,如果为空表示总部策略',
  `createTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '策略创建时间',
  `state` int(11) NOT NULL DEFAULT '0' COMMENT '策略状态,-1:系统默认策略,0:创建,1:发布,2:废弃',
  `editurl` varchar(150) DEFAULT NULL COMMENT '编辑时所用的url,这个url表示=以前的所有字符.',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='策略基本信息表';

CREATE TABLE `p_timepolicy` (
  `timepolicyid` int(11) NOT NULL AUTO_INCREMENT,
  `starttime` datetime DEFAULT NULL,
  `endtime` datetime DEFAULT NULL,
  `description` varchar(128) DEFAULT NULL,
  `name` varchar(32) DEFAULT NULL,
  `domainid` int(11) DEFAULT NULL,
  PRIMARY KEY (`timepolicyid`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;


####  新定义的配置policysn
insert into c_configs (configtype,configkey,configvalue) values(33,'policysn','0');

insert into p_policy_base (sn,`name`, des,createTime) values('04','访问控制策略',null,now());

insert into p_policy_base (sn,`name`, des,createTime) values('040002','时间策略',null,now());


##### 向p_policy_base添加数据存储过程
DROP PROCEDURE if exists addPolicyBase;
CREATE PROCEDURE addPolicyBase (
	in p_name varchar(60), in p_des varchar(60),
    in p_psn varchar(20), in p_fid int,
    in p_domainid int
)
begin         
     declare v_subsn int;  	                
     declare v_sn varchar(20);               
     declare v_psn varchar(20);     
     declare v_pediturl varchar(150);
	
	 #得到并更新下一个子策略sn	
     select cast(configvalue as UNSIGNED)+1 into v_subsn from c_configs where configtype=33 and configkey='policysn';
     update c_configs set configvalue=CONCAT(v_subsn) where configtype=33 and configkey='policysn';          

	 #扩展sn长度
     if v_subsn>=1 and v_subsn<=9 then     
        set v_sn= CONCAT('000',v_subsn);
     end if;
          
     if v_subsn>=10 and v_subsn<=99 then     
        set v_sn= CONCAT('00',v_subsn);
     end if;          

     if v_subsn>=100 and v_subsn<=999 then     
        set v_sn= CONCAT('0',v_subsn);
     end if;     

     if v_subsn>=1000 and v_subsn<=9999 then     
        set v_sn= CONCAT('',v_subsn);        
     end if;

     #查看策略sn
     #select v_sn as subsn;             
     #select sn from p_policy_base where `type`=1 and length(sn)=6;          
          
     #得到父策略sn(len:6),v_psn主要用来判断策略分类是否存在
     select sn,editurl into v_psn,v_pediturl from p_policy_base where length(sn)=6 and sn=p_psn;
     
     #真正的策略sn                   
     set v_sn = CONCAT(p_psn,'-', v_sn);
          
     #插入子策略     
     if v_psn is not null then
        insert into p_policy_base (sn,`name`,des,fid,domainid,createTime,state,editurl) 
               values(v_sn,p_name,p_des,p_fid,p_domainid,now(),0, CONCAT(v_pediturl,p_fid));
     end if;
     
     #如果没有相应的策略分类(主要用于查错)
     if v_psn is null then 
     	#插入相应的策略分类     
        insert into p_policy_base (sn,`name`,fid,createTime,state) 
               values(p_psn,p_psn,0,now(),0);
        #再插入相应的子策略     
        insert into p_policy_base (sn,`name`,des,fid,domainid,createTime,state,editurl) 
               values(p_psn,p_name,p_des,p_fid,p_domainid,now(),0, CONCAT(p_fid));
     end if;
end;

##### 更新p_policy_base信息存储过程
DROP PROCEDURE if exists updatePolicyBase;
CREATE PROCEDURE updatePolicyBase (
    in p_name varchar(60), in p_des varchar(60),
    in p_psn varchar(20), in p_fid int,
    in p_domainid int
)
begin 
     update p_policy_base set `name`=p_name,des=p_des,domainid=p_domainid 
            where length(sn)>6 and sn like CONCAT(p_psn,'%') and fid=p_fid;               
     #测试
     #insert into test (`name`, des, time) values ('update',CONCAT(p_psn,':',p_fid), now());
end;


##### p_timepolicy的insert触发器
DROP TRIGGER IF EXISTS `p_timepolicy_trigger_insert`;
CREATE  TRIGGER `p_timepolicy_trigger_insert` AFTER INSERT ON `p_timepolicy` FOR EACH ROW 
BEGIN     
     declare p_name varchar(32);       
     declare p_des varchar(128);     
     declare p_fid int;            
     declare p_domainid int;            
	
     select timepolicyid,`name`,description,domainid into p_fid,p_name,p_des,p_domainid 
     from p_timepolicy order by timepolicyid desc limit 0,1;     
     call addPolicyBase(p_name,p_des,'040002', p_fid, p_domainid);
	 
	 update c_frontconfig set valuestr=CONCAT(UNIX_TIMESTAMP()) where name='p_timepolicy';
END;

##### p_timepolicy更新操作触发器
DROP TRIGGER `p_timepolicy_trigger_update`;
create Trigger p_timepolicy_trigger_update  after  update on  p_timepolicy for each ROW
BEGIN
     call updatePolicyBase(NEW.`name`, NEW.description, '040002', OLD.timepolicyid, NEW.domainid);

     update c_frontconfig set valuestr=CONCAT(UNIX_TIMESTAMP()) where name='p_timepolicy';
end;

#### 删除策略存储过程
#### 调用此方法,将会删除p_policy_base及具体策略信息表
DROP PROCEDURE if exists deletePolicy;
CREATE PROCEDURE deletePolicy (
       in p_policyid int       
)
begin    
     declare v_sn6 varchar(20);          
     declare v_fid int;
     #in p_sn varchar(20), in p_fid int     

     select LEFT(sn,6),fid into v_sn6,v_fid from p_policy_base where id=p_policyid;  
     delete from  p_policy_base  where id=p_policyid and state<>-1; 
        
     if v_sn6='040001' then
        delete from p_ippolicy where ippolicyid=v_fid;
     elseif v_sn6='040002' then               
        delete from p_timepolicy where timepolicyid=v_fid;            
     elseif v_sn6='040021' then               
        delete from p_orderset where setid=v_fid;                 
     elseif v_sn6='040041' then          
        delete from p_orderset where setid=v_fid; 
     elseif v_sn6='040061' then     
        delete from p_orderset where setid=v_fid; 
     #else     
     #   delete from p_orderset WHERE 1<>1;
     end if; 
end;

#### 调用删除策略,参数p_policy_base.id
call deletePolicy(57);



一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值