create triggr triafterinsertcmdlog

after insert on cmd_log FOR EACH ROW

trigger_body

.#NEW : 代表新的记录

.#OLD : 代表老的记录

#准备表
CREATE TABLE CMD (
id INT PRIMARY KEY auto_increment,
user char(32),
priv char(10),
cmd char(64),
sub_time datetime,   #提交时间
success enum('yes','no')   #0代表NO
);

create table err_log(
id int primary key auto_increment,
err_cmd char(64),
err_time datetime
);

#创建触发器
delimiter //
create table tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW
begin
    IF NEW.success = 'no' THEN #等值判断一个信号
        INSERT INTO err_log(err_cmd,err_time) values(new.cmd. new.sub_time) #必须加分号
    END IF;  #必须加分号
END//
delimiter;                               

call 是调存储过程

3 . 事务 :

要么同时成立,要么同时不成立.

create table user( id int primary key auto_increment, name char(32), balance int );

insert into user(name,balance) values ('pp',6),('ww',6),('ff',6);

.#原子操作 start transaction; update user set balance = 2 where name = 'pp', update user set balance = 10 where name = 'ww'

4 . 存储过程

1. 程序与数据实现解耦
2. 减少网络传输的数据量
对于存储过程,可以接受参数,其参数有三种 :
    1. in   仅用于传入参数用
    2. out  仅用于返回值用
在python里面运行

import pymysql

conn = pymysql.connect(host = '127.0.0.1' , port = 5555 , user = 'root' , passwd = '123' , db = '...')

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

#执行存储过程
cursor.callproc('p1',args=(1,2,3,4))

#获取执行完存储的参数
cursor.excute(?????????????????????)
res = cursor.fetchall()

conn.commit()
cursor.close()
conn.close()

print(result)

#建表
create table dep(
id int primary key auto_increment,
name char(32)
);

create table user(
id int primary key auto_increment,
name char(32),
dep_id int,
foreign key(dep_id) references dep(id)
);

insert into dep(name) values('外交部'),('公关部'),('')

#创建触发器的语法 :
CREATE
    TRIGGER tregger_name
    tregger_time trigger_event
    ON tbl_name FOR EACH ROW
    trigger_body

trigger_time : {BEFORE | AFTER}
trigger_event : {INSERT | UPDATE | DELETE}

#第一步 : 准备表
create table cmd_log(
id int primary key auto_increment,
cmd_name char(64),
sub_time datetime,
user_name char(32),
is_success enum('yes','no')
);

create table err_log(
id int primary key auto_increment,
cname char(64),
stime datetime
);

#第二步 : 创建触发器
delimiter //

CREATE
    TRIGGER tri_after_insert_cmd_log
    after insert
    ON cmd_log FOR EACH ROW
BEGIN
    if new.is_success = 'no' THEN
        insert into err_log(cname,stime) values(new.cmd_name,new.sub_time);
    end if ;

END //

delimiter ;

#测试
insert into cmd_log(cmd_name,sub_time,user,is_success) values
('ls -l /etc | grep *.conf',now(),'root','no'), #NEW.id,NEW.cmd_name,NEW.sub_time
('ps aux |grep mysqld',now(),'root','yes'),
('cat /etc/passwd |grep root',now(),'root','yes'),
('netstat -tunalp |grep 3306',now(),'egon','no');

########存储过程

#使用存储过程的优点 :
    1. 程序与数据实现解耦
    2. 减少网络传输的数量

#创建无参存储过程
delimiter //
create procedure p1()
begin
    select * from test;
    insert into test(username,dep_id) values('zsb',2);

end //
delimiter ;

#调用存储过程
call p1() ;  #在mysql中调用
cursor.callproc('p1')  #在python中通过pymysql模块调用

=============
对于存储过程,可以接受参数,参数有三类 :
#in         仅用于传入参数用
#out        仅用于返回值用
#inout      既可以传入又可以当做返回值

#创建有参存储过程之 in 的使用
delimiter //
create procedure p2(
    in m int,
    in n int)
begin
    select * from test where id between m and n ;
end //
delimiter ;

#调用存储过程
call p2(3,7) ;  #在mysql中调用
cursor.callproc('p2',args=(3,7)) #在python中通过pymysql模块调用

================
#创建有参存储过程之out的使用
delimiter //
create procedure p3(
    in m int,
    in n int,
    out res int
)
BEGIN
    select * from blog where id between m and n;
    set res = 1;
END //
delimiter ;

#调用存储过程
#在mysql中调用
set @res=0; #0代表假(执行失败),1代表真(执行成功)
call p3(3,7,@res);
select @res;

#在python中基于pymysql调用
cursor.callproc('p3',(3,7,123))  #@_p3_0=3,@_p3_1=7,@_p3_2=123
print(cursor.fetchall()) #查询select的查询结果,只拿到存储过程中的select的查询结果

cursor.execute('select @_p3_0,@_p3_1,@_p3_2;') #@p3_0代表第一个参数,@p3_1代表第二个参数,即返回值
print(cursor.fetchall())

#===============================================
#创建有参存储过程之inout的使用

delimiter //
create procedure p4(
    inout m int
)
begin
    select * from test where id > m;
    set m=1;
end //
delimiter ;

#在mysql中
set @x=2;
call p4(@x);
select @x;

delimiter //
create procedure p5(
    inout m int
)
begin
    select * from test11111111 where id > m;
    set m=1;
end //
delimiter ;

set @x=2;
call p5(@x);
select @x;

#====================捕捉异常+事务===========================
delimiter //
create PROCEDURE p6(
    OUT p_return_code tinyint
)
BEGIN
    DECLARE exit handler for sqlexception
    BEGIN
        -- ERROR
        set p_return_code = 1;
        rollback;
    END;

    DECLARE exit handler for sqlwarning
    BEGIN
        -- WARNING
        set p_return_code = 2;
        rollback;
    END;

    START TRANSACTION;
        insert into test(username,dep_id) values('egon',1);
        DELETE from tb1111111; #执行失败
    COMMIT;

    -- SUCCESS
    set p_return_code = 0; #0代表执行成功

END //
delimiter ;

#用python模拟
try:
    START TRANSACTION;
        DELETE from tb1; #执行失败
        insert into blog(name,sub_time) values('yyy',now());
    COMMIT;
    set p_return_code = 0; #0代表执行成功
except sqlexception:
    set p_return_code = 1;
    rollback;
except sqlwaring:
    set p_return_code = 2;
    rollback;

mysql> show procedure status like 'p1%'; #查看某一类存储过程

#7. 流程控制
#函数中不要写sql语句,它仅仅是一个功能,是一个在sql中被应用的功能
#若要想在begin...end...中写sql,请用存储过程

delimiter //
create function f5(
    i int
);

returns int
begin
    declare res int default 0;
    if i = 10 then
        set res = 100;
    elseif i = 20 then
        set res = 200;
    elseif i = 30 then
        set res = 300;
    else
        set res = 400;
    end if ;
    return res ;

end //
dilimiter;

#while循环
delimiter //
create procedure proc_while();
begin
        declare num int ;
        set num = 0 ;
        while num < 10 do
            select
                num ;
            set num = num + 1 ;
        end while ;

end //
delimiter ;

MySQL视图,触发器,事务,存储过程,函数的更多相关文章

  1. MySQL 视图触发器事务存储过程函数

    事务  致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...

  2. MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化

    视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...

  3. MySQL——视图/触发器/事务/存储过程/函数/流程控制

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  4. mysql 视图 触发器 事物 存储过程 函数 流程控制

    1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...

  5. MySQL_视图/触发器/事务/存储过程/函数

    视图.触发器.事务.存储过程.函数 视图 视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,可以将该结果集当作表来使用 #创建视 ...

  6. MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  7. python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原

    ###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...

  8. Python11/26--mysql之视图/触发器/事务/存储过程

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的时候直接使用即可 2.为什么用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 select * from ...

  9. mysql 视图 触发器 存储过程 函数事务 索引

    mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...

随机推荐

  1. Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  2. Fiddler使用总结一(使用Fiddler捕获手机所有http/https通信)

    与后端数据通信是前端日常开发的重要一环,在与后端接口联调的时候往往需要通过查看后端返回的数据进行调试.如果在PC端,Chrome自带的DevTools就已经足够用了,Network面板可以记录所有网络 ...

  3. Shiro学习之身份验证

    身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...

  4. 【Sqlserver系列】初级思维导图

    1   概述 本篇文章主要概述Sqlserver思维导图. 2   具体内容 3   参考文献 [01]https://mp.weixin.qq.com/s/USNMslpvu7pWosMZnVTPd ...

  5. 前端优化之动画为什么要尽量用css3代替js

    导致JavaScript效率低的两大原因:操作DOM和使用页面动画.通常我们会通过频繁的操作 DOM的CSS来实现视觉上的动画效果,导致js效率低的两个因素都包括在内了在频繁的操作DOM和CSS时,浏 ...

  6. Material使用07 MatGridListModule的使用

    1 MatGridListModule简介 对相似数据的展现,尤其是像是图片的展示 使用起来很像表格 官方文档:点击前往 2 MatGridListModule提供的指令 2.1 mat-grid-l ...

  7. Freemarker页面静态化技术,activemq监听页面变动

    初步理解: 架构优化: 静态页面的访问速度优于从缓存获取数据的动态页面的访问速度: Freemarker: 导包 模板:hello.ftl <!DOCTYPE html> <html ...

  8. CentOS 7 学习(四)Git配置(一)

    CentOS 7 学习(四)Git配置(一) 1.对于版本管理系统,目前常用的是Subverion和Git,Subversion是集中式版本管理系统中最好的,所有人的代码都要提交到服务器上,如果要知道 ...

  9. Javascript之模拟文字高亮

    在我们平时浏览网页的时候,我们常常会用到Ctrl+F(搜索)功能,被搜索到的文字就是高亮显示.那么,如何在Javascript中模拟文字高亮显示这一功能呢? 以下为笔者写的样例代码: <!DOC ...

  10. if;脚本中退出语句:exit 数字,用$?查时为exit设置的数字,此数字为程序执行完后的返回数据,可以通过此方法自动设定

    if [ 条件 ];then 代码 fi if [ 条件 ] then 代码 fi [root@localhost ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda5 % ...