精华内容
下载资源
问答
  • SQL SERVER之触发器

    2020-04-18 15:57:25
    触发器: 一种对表更改时自动...–触发器创建时,会生成两张临时表(DELETED、INSERTED) – FOR:和执行操作同时触发 – AFTER:执行之后触发,无约束权限 – INSTEAD OF:带约束权限触发器触发器(带事务):默认是一个...

    触发器:
    一种对表更改时自动执行SQL代码块的对象,普通的存储过程需要通过EXEC命令来调用存储过程,
    –触发器则不需要,可以根据事件(插入、更新、删除)自动执行(触发机制)
    –触发器创建时,会生成两张临时表(DELETED、INSERTED)
    – FOR:和执行操作同时触发
    – AFTER:执行之后触发,无约束权限
    – INSTEAD OF:带约束权限触发器
    –触发器(带事务):默认是一个完整的逻辑单元,不可分割。
    –创建触发器:添加新产品的触发器

    DELETED:该表存放了在执行删除或更新操作后所受影响的记录.
    在执行DELETE或UPDATE操作时,被删除的记录会被移动到DELETE表中
    INSERTED:该表存放了在执行插入或更新操作后影响的记录

    在执行INSERT或UPDATE操作时,新的记录会被同时添加到触发器的表的INSERT表中

    触发器主要有以下几个优点:
    1.触发器是自动执行的,一旦设立就存在一种触发机制,永远监控着数据库的事件状态。
    2.触发器可以对数据库中的表进行层叠更改。
    3.触发器可与设置比CHECK更为复杂的约束限制,触发器还可以对不同表中的列进行引用

    触发器是一种特殊的存储过程,创建的语法结构和存储过程类似,

    基本语法格式:
    CREATE TRIGGER [schema_name] trigger_name
    ON {table|view}
    {WITH <dml_trigger_option> [,…n]}
    {FOR|AFTER|INSTANCE OF}{ [INSERT] {,} [UPDATE] [,] [DELETE] }
    {WITH APPEND}
    [NOT FOR REPLICATION]
    AS
    {sql_statement [;] [,…n] [EXTERNAL NAME <method specifir [;]>]}

    trigger_name:触发器的名称
    table|view:指定执行触发器的表或视图
    AFTER:用于指定触发器只有在SQL语句中指定数据操作完成后才能被触发,有关级联操作和约束性检查也成功后才能执行触发器。AFTER关键字没有指定,AFTER就为默认值,该类型的触发器只能创建在表上,视图上不能创建。
    INSTANCE OF:是一种动作执行前的触发类型。用触发器代替触发语句进行操作。在表或视图中只能定义一个INSTANCE OF触发器,可以定义多个AFTER触发器。
    {[INSERT][,][UPDATE][,][DELETE]}:用于指定数据库在执行哪种数据操作事件响应触发器可以一次指定多个关键字,用逗号隔开。
    AS:触发器要执行的操作
    sql_statement:指定触发器中执行T-SQL语句时的尝试,触发器可以包含任意数量和种类的T-SQL语句。

    insert触发器:
    Demo 01:

    CREATE TRIGGER product_inserted 
    ON Product
    AFTER INSERT
    AS 
    BEGIN
     PRINT '添加了新产品'
    END
    

    测试代码:

    INSERT INTO Product(ProductName,Price) VALUES('戴森(DYSON)台灯 CD06 Lightcycle Morph',$4490)
    

    DELETE触发器:
    返回被删除的记录信息

    CREATE TRIGGER product_deleted 
    ON Product 
    AFTER DELETE
    AS
    BEGIN
      SELECT ProductName,Price FROM DELETED
    END
    

    测试代码:

    DELETE FROM Product WHERE ProductNo=2007
    

    UPDATE触发器:当用户执行UPDATE语句时被调用:
    更改指定的记录的产品名称,获取更新前后的数据

    CREATE TRIGGER product_updated 
    ON Product 
    AFTER UPDATE 
    AS
    BEGIN
     SELECT ProductName AS '更新前的产品名称',Price FROM DELETED
     SELECT ProductName AS '更新后的产品名称',Price FROM INSERTED
    END
    

    测试代码:

    UPDATE Product SET ProductName='Oppo Find X2 Pro' WHERE ProductNo=1020
    --使用AFTER触发器首先会建立INSTERED和DELETED表,然后执行SQL语句中的数据操作
    --最后才会执行触发器中的代码
    

    INSTEAD OF 触发器:
    当添加新产品时,如果价格大于100000拒绝添加

    CREATE TRIGGER product_insertedcheck
    ON Product
    INSTEAD OF INSERT
    AS
    BEGIN
    DECLARE @price MONEY
    SELECT @price=Price FROM inserted
    IF @price>=100000
    BEGIN
     RAISERROR('新产品价格大于10W元,不能添加!',16,1)
     ROLLBACK TRAN  --事务回滚
    END
    END 
    
    --INSTEAD OF触发器:在建立INSERTED 和DELETED表后,直接执行触发器
    
    --测试代码:
    INSERT INTO Product(ProductName,Price) VALUES('BMW 跑车',520000)
    

    注意:
    如果执行了SQL语句的数据操作,并不意味着已经提交到了数据库(持久化操作)–隐式事务
    –有可能有触发器被触发,在触发器中抛出异常或者进行了显式的事务回滚,导致没有提交到数据库中

    使用触发器:限制对保护数据的操作

    CREATE TRIGGER product_limitupdated 
    ON Product 
    AFTER UPDATE
    AS
    BEGIN
     --update关键字,检测字段是否被更新过
      IF UPDATE(Price) AND EXISTS(SELECT * FROM inserted WHERE ProductNo=1018)
      BEGIN
      RAISERROR('产品编号为1018的价格不能被更改!',16,1) --抛出异常
      ROLLBACK TRAN --回滚事务
      END
    END
    
    --测试代码:
    UPDATE Product SET Price=8956 WHERE ProductNo=1018
    

    实现级联操作:
    通过触发器对有关系(主外键)的表进行级联操作(级联更新、级联删除)

    删除台灯产品类型,级联删除相关的Product子记录

    CREATE TRIGGER trigproductdelete 
    ON ProductType
    INSTEAD OF  DELETE  --INSTEAD OF:带约束权限:执行顺序问题,
    AS
    BEGIN
     DECLARE @typeId INT
     SELECT @typeId=TypeId FROM DELETED
    
     DELETE FROM Product WHERE TypeId=@typeId  --先删除所有相关的子记录,才能删除对应的父记录
     DELETE FROM ProductType WHERE TypeId=@typeId --删除父记录
    END
    
    --测试代码:
    DELETE ProductType WHERE TypeId=4
    SELECT * FROM ProductType
    

    使用存储过程查看触发器:

    sp_helptext trigproductdelete  --trigproductdelete为触发器名称
    sp_help trigproductdelete 
    

    禁用和启用触发器:
    触发器一旦被创建完成后便处于监听状态,只要触发数据操作(增删改),触发器就会被触发。

    DISABLE TRIGGER trigproductdelete,ProductType_Delete  ON ProductType
    ENABLE TRIGGER trigproductdelete,ProductType_Delete  ON ProductType
    
    展开全文
  • 查看和删除触发器4.小结 1.什么是触发器? 触发器是由一段代码块组成,当表中的数据发生变化(如INSERT、UPDATE 或 DELETE )时,自动唤醒调用触发器中的代码,从而起到了保证业务规则和数据的完整性的作用。 比如...

    触发器实现多表同步更新学生信息--目录


    1.什么是触发器?

    触发器是由一段代码块组成,当表中的数据发生变化(如INSERT、UPDATE 或 DELETE )时,会自动唤醒调用触发器中的代码,从而起到了保证业务规则和数据的完整性的作用。

    比如在网上商城系统中,当商家的一个商品被用户购买时,在订单表生成数据的同时,需要从商家库存表中减去该商品。

    还有当一个商家账户注销时,删除用户表中该商家记录的同时,还需要将商家对应的商品数据,销售订单记录和库存记录等信息删除,这些都可以使用触发器来完成。

    触发器也可以起到字段约束的作用,用来检查字段的新增值是否符合规则,如果异常及时返回错误,阻塞插入。

    2.创建触发器

    不同数据库创建触发器的语法存在细微的差距,在MariaDB(MySQL分支)中创建触发器语法如下:

    create trigger trigger_name trigger_time trigger_event on table_name for each now trigger_stmt
    

    其中:

    • trigger_name:触发器名称,开发者自定义;
    • trigger_time:什么时候触发,取值为BEFORE或AFTER,表示是在trigger_event事件之前还是之后执行触发器。
    • trigger_event:触发事件,取值为insert、update、delete;
    • table_name:触发器相关联的表名,即在哪张表上进行操作室执行触发器。
    • trigger_stmt:触发器代码块,一条或多条SQL语句;
    • fo reach now:每影响一行记录,就触发执行一次触发器的SQL;

    从 trigger_time 和 trigger_event 的组合来看可以创建 6 种触发器,即:BEFORE INSERT、BEFORE
    UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE;

    另外在 MariaDB 中限制在同一张表不能创建两种相同类型的触发器,因此在一张表最多创建6个触发器。

    以下 SQL 脚本是在 MariaDB 中的学生选课成绩表 elective 上创建 after insert 的触发器,它的主要作用是在当向学生选课信息 student 表新增一条记录后,更新学生信息表中对应学生的总学分成绩。

    delimiter //
    drop trigger if exists tri_elective_insert //
    create trigger tri_elective_insert after insert
    on elective for each row
    begin
    declare number int;
    select (case when grade >= 60 then 5 else 4 end ) into number from elective where id= new.id;
    update student set sum_grade = number +  ifnull(sum_grade,0) where sid = new.sid;
    end //
    delimiter ;
    

    可以看到上面脚本中定义了 new 和 old 这两个关键字代表 elective 表触发了触发器的那行数据,new表示修改后 (update语句)或插入 (insert语句)的新记录,相反 old 表示修改前(update语句)或被删除(delete语句)的原数据。

    SQL脚本中的关键字 DELIMITER 起到申明 SQL 语句结束符的作用,当然,MySQL 结束符是可以自由设定的,可以用 “/” 或者“$$”等字符 ,如果不设置结束符,MySQL 的默认 SQL 语句结束符为";"。

    由于上面 SQL 脚本是一个整体,需要通过 DELIMITER 申明结束符"//",让数据库明白,当再次遇到这个符号时脚本才算完整,可以执行前面的脚本了,脚本最后需要将结束符重新改为分号:DELIMITER ;

    我们通过以下SQL脚本测试下刚刚创建的触发器 tri_elective_insert:

    insert into elective(sid,cid,createtime,grade) values('1006','31',now(),93);
     select  * from student where sid='1006';
    

    当执行上面的脚本向学生成绩信息表 elective 新增一条记录时,会触发触发器中脚本的执行,通过查询 SQL 可以看到编号为 1006 的总学分成绩从 0 已经变成了 5。
    在这里插入图片描述

    3.查看和删除触发器

    在 MySQL 中查看触发器,使用下面的SQL语句:

    show triggers
    

    结果集:
    在这里插入图片描述

    查询语句会输出当前库所有的触发器,如果希望查询一张表的触发器,可以通过查询系统表information_schema.triggers 来实现,比如查询 elective表中的所有的触发器:

    select * from information_schema.triggers  where event_object_table='elective'
    

    结果集:
    在这里插入图片描述
    MySQL 数据库提供了删除触发器的语法:

    DROP TRIGGER [if exists] trigger_name --删除触发器 
    

    值得注意的是,如果触发器不需要了一定及时删除,以免造成意外操作导致数据的混乱。

    4.小结

    本节我们一起学习了数据库表的触发器,但这里给大家的建议是在项目开发过程中,尽量不要使用触发器,这是为什么呢? 主要有以下两点考虑:

    1. 假如我们想向表 elective 中插入上万条记录,那么触发器就会被触发上万次,触发器的每次执行都会消耗资源,
    2. 触发的次数越多,相应消耗的资源越多;
    3. 触发器对开发者来说是自动执行的,当出现数据不一致或数据混乱时,不容易定位问题,触发器的代码也是最容易被忽略的;
    4. 如果已经使用了触发器,那么可以考虑将触发器中的代码迁移到存储过程中或者写入应用程序中处理,这样可以规避触发器带来的负面影响。

    ---------------------------------------------------------总结自慕课网(10年DBA玩转SQL)一文----------------------------------------------

    展开全文
  • 目前解决方法就是在语句触发器最后增加一条删除临时表数据,这样保证临时表始终是最新插入的数据。代码如下:   <pre name="code" class="sql"> CREATE TABLE A  ( id number, name varchar2(30), ...
  • 使用 Navicat 的逆向工程,你可以从一个现有的数据库创建数据库模型,可视化地显现和编辑你的数据库结构或创建一个图形模型,并由模型生成一个数据库。 8、正向工程和脚本生成 同步到数据库功能给你充分了解所有...
  • 序列的使用 ... 1.序列介绍 序列: 是 oracle 提供的用于产生一系列唯一数字的数据库对象。 ...Oracle 序列(Sequence)主要用于生成流水号,在应用中经常用到,特别是作为ID...通过创建Oracle序列和触发器实现表的主...

    序列的使用

    1.序列介绍

    序列: 是 oracle 提供的用于产生一系列唯一数字的数据库对象。
    Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键。
    通过创建Oracle序列和触发器实现表的主键自增。
    序列的用途一般用来填充主键和计数。

    2.修改序列初始值

    有时候需要修改序列初始值,有以下几种方法:

    方法一:
        (1)删除序列;  (2)重新创建; 这个方法比较简单粗暴。
    drop sequence  sequence_name;
     
    create sequence   sequence_name
    minvalue 1                                                             //最小值
    maxvalue 999999999999999999999999999  //最大值
    start with  10                                                         //初始值
    increment by 1                                                     //步长
    cache 20;                                                               //序列号缓存
     
    方法二:
    通过Increment By来实现修改初始值。
    例如:若序列名称是seq_name,初始值是15,而现在要设置初始值为1015,Increment By值为:1000(1013-13)
    1) 执行:alter sequence seq_name increment by 1000;
    2) 执行:select seq_name .nextval from dual;
    3) 执行:alter sequence seq_name increment by 1;
    修改完成。
     

    CREATE SEQUENCE [ schema. ]sequence
    [ { INCREMENT BY | START WITH } integer
    | { MAXVALUE integer | NOMAXVALUE }
    | { MINVALUE integer | NOMINVALUE }
    | { CYCLE | NOCYCLE }
    | { CACHE integer | NOCACHE }
    | { ORDER | NOORDER }
    ];


    ALTER SEQUENCE [ schema. ]sequence
    { INCREMENT BY integer
    | { MAXVALUE integer | NOMAXVALUE }
    | { MINVALUE integer | NOMINVALUE }
    | { CYCLE | NOCYCLE }
    | { CACHE integer | NOCACHE }
    | { ORDER | NOORDER }
    };

    1)结论一:在初创建的Sequence上第一次使用nextval的时候,得到是初始值,不是初始值加一!
    2)结论二:第一次NEXTVAL初始化之后才能使用CURRVAL取值;
    3)结论三:可以在一条SQL语句中同时得到nextval和currval值;
    4)结论四:从上面的alter sequence的语法看,可以得到这样一个结论,无法使用alter语句修改序列的当前值。
     
    使用(在插入语句中使用)

    <insert id="insert" parameterType="com.test.domain.Student"
    useGeneratedKeys="true" keyProperty="Id">
    <selectKey resultType="int" order="BEFORE" keyProperty="Id">
    select SEQ_STUDENT_ID.nextval from dual
    </selectKey>
    insert into student
    <trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="id!= null">
    ID,
    </if>
    <if test="name!= null">
    NAME,
    </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
    <if test="id != null">
    #{id,jdbcType=INTEGER},
    </if>
    <if test="name != null">
    #{name,jdbcType=INTEGER},
    </if>
    </trim>
    </insert>

     

     

    转载于:https://www.cnblogs.com/juanzila/p/8953473.html

    展开全文
  • 每个存储过程有多个参数,可以控制输出何种形式的内容,如可以只生成删除表的sql,可以在生成创建表与索引的语句上加上storage子句等等。 <br/>运行 user_dll_sql.sql的准备工作: <br/>1. ...
  • OAK工具ONLINE DDL:原理:1. 创建一个临时表,包含DDL所产生的改变。2. 在原表上创建三个触发器:INSERT, UPDATE, DELETE。3. COPY原表的数据到临时表,这个时候就算原...5. 删除触发器。6. 删除临时表。依赖:1. ...

    OAK工具ONLINE DDL:

    原理:

    1. 创建一个临时表,包含DDL所产生的改变。

    2. 在原表上创建三个触发器:INSERT, UPDATE, DELETE。

    3. COPY原表的数据到临时表,这个时候就算原表有数据也会同时插入到临时表,这样才能保持数据的一致性。

    4. 执行RENAME操作:将原表COPY成临时表,新生成的临时表COPY成生产业务表。

    5. 删除触发器。

    6. 删除临时表。

    依赖:

    1. 表必须有主键。

    2. 在RENAME时不能对表有大的操作。

    3. 不要有触发器。

    4. 不能删除外键,创建外键。

    1. 安装所依赖的软件包:

    yum install MySQL-python -y

    2. 查看表是否有触发器,如果有则备份后进行删除。如果没有则可以执行下一步。

    原因: 因为一个表上一种类型的触发器只能建一个,OAK的工具在ONLINE DDL时是将原表COPY内容到一张临时表,然后通过触发器的方式在上面建三个触发器:

    INSERT, UPDATE, DELETE的操作复制到临时表。 因此这里会有冲突。

    3. 准备验证脚本:

    select sum(crc32(concat(ifnull(id,'NULL'),ifnull(o_id,'NULL')))) as sum from t_test union all select sum(crc32(concat(ifnull(id,'NULL'),ifnull(o_id,'NULL')))) as sum from t_test_new_20140729 ;

    脚本的意思: 这个脚本是SUM主键ID的值进行比较,因为表的主键是由自增ID。

    4. 执行变更:

    python oak-online-alter-table -u root --ask-pass -S /tmp/mysql_3306.sock -d tpcc1000 -t t_test -g t_test_new_20140729 -a "add column name varchar(9) not null default ''" --sleep=300 --skip-delete-pass

    -- Connecting to MySQL

    Password:

    -- Table tpcc1000.t_test is of engine innodb

    -- Checking for UNIQUE columns on tpcc1000.t_test, by which to chunk

    -- Possible UNIQUE KEY column names in tpcc1000.t_test:

    -- - id

    -- Table tpcc1000.t_test_new_20140729 has been created

    -- Table tpcc1000.t_test_new_20140729 has been altered

    -- Checking for UNIQUE columns on tpcc1000.t_test_new_20140729, by which to chunk

    -- Possible UNIQUE KEY column names in tpcc1000.t_test_new_20140729:

    -- - id

    -- Checking for UNIQUE columns on tpcc1000.t_test, by which to chunk

    -- - Found following possible unique keys:

    -- - id (int)

    -- Chosen unique key is 'id'

    -- Shared columns: id, o_id

    -- Created AD trigger

    -- Created AU trigger

    -- Created AI trigger

    -- Attempting to lock tables

    -- Tables locked WRITE

    -- id (min, max) values: ([1L], [100000L])

    -- Tables unlocked

    -- - Reminder: altering tpcc1000.t_test: add column name varchar(9) not...

    -- Copying range (1), (1000), progress: 0%

    -- + Will sleep for 0.3 seconds

    -- Copying range (1000), (2000), progress: 1%

    -- + Will sleep for 0.3 seconds

    -- Copying range (2000), (3000), progress: 2%

    -- + Will sleep for 0.3 seconds

    -- Copying range (3000), (4000), progress: 3%

    -- + Will sleep for 0.3 seconds

    -- Copying range (4000), (5000), progress: 4%

    -- + Will sleep for 0.3 seconds

    -- Copying range (5000), (6000), progress: 5%

    -- + Will sleep for 0.3 seconds

    -- Copying range (6000), (7000), progress: 6%

    -- + Will sleep for 0.3 seconds

    -- Copying range (7000), (8000), progress: 7%

    -- + Will sleep for 0.3 seconds

    -- Copying range (8000), (9000), progress: 8%

    -- + Will sleep for 0.3 seconds

    -- Copying range (9000), (10000), progress: 9%

    -- + Will sleep for 0.3 seconds

    -- Copying range (10000), (11000), progress: 10%

    -- + Will sleep for 0.3 seconds

    -- Copying range (11000), (12000), progress: 11%

    -- + Will sleep for 0.3 seconds

    -- Copying range (12000), (13000), progress: 12%

    -- + Will sleep for 0.3 seconds

    -- Copying range (13000), (14000), progress: 13%

    -- + Will sleep for 0.3 seconds

    -- Copying range (14000), (15000), progress: 14%

    -- + Will sleep for 0.3 seconds

    -- Copying range (15000), (16000), progress: 15%

    -- + Will sleep for 0.3 seconds

    -- Copying range (16000), (17000), progress: 16%

    -- + Will sleep for 0.3 seconds

    -- Copying range (17000), (18000), progress: 17%

    -- + Will sleep for 0.3 seconds

    -- Copying range (18000), (19000), progress: 18%

    -- + Will sleep for 0.3 seconds

    -- Copying range (19000), (20000), progress: 19%

    -- + Will sleep for 0.3 seconds

    -- - Reminder: altering tpcc1000.t_test: add column name varchar(9) not...

    -- Copying range (20000), (21000), progress: 20%

    -- + Will sleep for 0.3 seconds

    -- Copying range (21000), (22000), progress: 21%

    -- + Will sleep for 0.3 seconds

    -- Copying range (22000), (23000), progress: 22%

    -- + Will sleep for 0.3 seconds

    -- Copying range (23000), (24000), progress: 23%

    -- + Will sleep for 0.3 seconds

    -- Copying range (24000), (25000), progress: 24%

    -- + Will sleep for 0.3 seconds

    -- Copying range (25000), (26000), progress: 25%

    -- + Will sleep for 0.3 seconds

    -- Copying range (26000), (27000), progress: 26%

    -- + Will sleep for 0.3 seconds

    -- Copying range (27000), (28000), progress: 27%

    -- + Will sleep for 0.3 seconds

    -- Copying range (28000), (29000), progress: 28%

    -- + Will sleep for 0.3 seconds

    -- Copying range (29000), (30000), progress: 28%

    -- + Will sleep for 0.3 seconds

    -- Copying range (30000), (31000), progress: 30%

    -- + Will sleep for 0.3 seconds

    -- Copying range (31000), (32000), progress: 31%

    -- + Will sleep for 0.3 seconds

    -- Copying range (32000), (33000), progress: 32%

    -- + Will sleep for 0.3 seconds

    -- Copying range (33000), (34000), progress: 33%

    -- + Will sleep for 0.3 seconds

    -- Copying range (34000), (35000), progress: 34%

    -- + Will sleep for 0.3 seconds

    -- Copying range (35000), (36000), progress: 35%

    -- + Will sleep for 0.3 seconds

    -- Copying range (36000), (37000), progress: 36%

    -- + Will sleep for 0.3 seconds

    -- Copying range (37000), (38000), progress: 37%

    -- + Will sleep for 0.3 seconds

    -- Copying range (38000), (39000), progress: 38%

    -- + Will sleep for 0.3 seconds

    -- Copying range (39000), (40000), progress: 39%

    -- + Will sleep for 0.3 seconds

    -- - Reminder: altering tpcc1000.t_test: add column name varchar(9) not...

    -- Copying range (40000), (41000), progress: 40%

    -- + Will sleep for 0.3 seconds

    -- Copying range (41000), (42000), progress: 41%

    -- + Will sleep for 0.3 seconds

    -- Copying range (42000), (43000), progress: 42%

    -- + Will sleep for 0.3 seconds

    -- Copying range (43000), (44000), progress: 43%

    -- + Will sleep for 0.3 seconds

    -- Copying range (44000), (45000), progress: 44%

    -- + Will sleep for 0.3 seconds

    -- Copying range (45000), (46000), progress: 45%

    -- + Will sleep for 0.3 seconds

    -- Copying range (46000), (47000), progress: 46%

    -- + Will sleep for 0.3 seconds

    -- Copying range (47000), (48000), progress: 47%

    -- + Will sleep for 0.3 seconds

    -- Copying range (48000), (49000), progress: 48%

    -- + Will sleep for 0.3 seconds

    -- Copying range (49000), (50000), progress: 49%

    -- + Will sleep for 0.3 seconds

    -- Copying range (50000), (51000), progress: 50%

    -- + Will sleep for 0.3 seconds

    -- Copying range (51000), (52000), progress: 51%

    -- + Will sleep for 0.3 seconds

    -- Copying range (52000), (53000), progress: 52%

    -- + Will sleep for 0.3 seconds

    -- Copying range (53000), (54000), progress: 53%

    -- + Will sleep for 0.3 seconds

    -- Copying range (54000), (55000), progress: 54%

    -- + Will sleep for 0.3 seconds

    -- Copying range (55000), (56000), progress: 55%

    -- + Will sleep for 0.3 seconds

    -- Copying range (56000), (57000), progress: 56%

    -- + Will sleep for 0.3 seconds

    -- Copying range (57000), (58000), progress: 56%

    -- + Will sleep for 0.3 seconds

    -- Copying range (58000), (59000), progress: 57%

    -- + Will sleep for 0.3 seconds

    -- Copying range (59000), (60000), progress: 59%

    -- + Will sleep for 0.3 seconds

    -- - Reminder: altering tpcc1000.t_test: add column name varchar(9) not...

    -- Copying range (60000), (61000), progress: 60%

    -- + Will sleep for 0.3 seconds

    -- Copying range (61000), (62000), progress: 61%

    -- + Will sleep for 0.3 seconds

    -- Copying range (62000), (63000), progress: 62%

    -- + Will sleep for 0.3 seconds

    -- Copying range (63000), (64000), progress: 63%

    -- + Will sleep for 0.3 seconds

    -- Copying range (64000), (65000), progress: 64%

    -- + Will sleep for 0.3 seconds

    -- Copying range (65000), (66000), progress: 65%

    -- + Will sleep for 0.3 seconds

    -- Copying range (66000), (67000), progress: 66%

    -- + Will sleep for 0.3 seconds

    -- Copying range (67000), (68000), progress: 67%

    -- + Will sleep for 0.3 seconds

    -- Copying range (68000), (69000), progress: 68%

    -- + Will sleep for 0.3 seconds

    -- Copying range (69000), (70000), progress: 69%

    -- + Will sleep for 0.3 seconds

    -- Copying range (70000), (71000), progress: 70%

    -- + Will sleep for 0.3 seconds

    -- Copying range (71000), (72000), progress: 71%

    -- + Will sleep for 0.3 seconds

    -- Copying range (72000), (73000), progress: 72%

    -- + Will sleep for 0.3 seconds

    -- Copying range (73000), (74000), progress: 73%

    -- + Will sleep for 0.3 seconds

    -- Copying range (74000), (75000), progress: 74%

    -- + Will sleep for 0.3 seconds

    -- Copying range (75000), (76000), progress: 75%

    -- + Will sleep for 0.3 seconds

    -- Copying range (76000), (77000), progress: 76%

    -- + Will sleep for 0.3 seconds

    -- Copying range (77000), (78000), progress: 77%

    -- + Will sleep for 0.3 seconds

    -- Copying range (78000), (79000), progress: 78%

    -- + Will sleep for 0.3 seconds

    -- Copying range (79000), (80000), progress: 79%

    -- + Will sleep for 0.3 seconds

    -- - Reminder: altering tpcc1000.t_test: add column name varchar(9) not...

    -- Copying range (80000), (81000), progress: 80%

    -- + Will sleep for 0.3 seconds

    -- Copying range (81000), (82000), progress: 81%

    -- + Will sleep for 0.3 seconds

    -- Copying range (82000), (83000), progress: 82%

    -- + Will sleep for 0.3 seconds

    -- Copying range (83000), (84000), progress: 83%

    -- + Will sleep for 0.3 seconds

    -- Copying range (84000), (85000), progress: 84%

    -- + Will sleep for 0.3 seconds

    -- Copying range (85000), (86000), progress: 85%

    -- + Will sleep for 0.3 seconds

    -- Copying range (86000), (87000), progress: 86%

    -- + Will sleep for 0.3 seconds

    -- Copying range (87000), (88000), progress: 87%

    -- + Will sleep for 0.3 seconds

    -- Copying range (88000), (89000), progress: 88%

    -- + Will sleep for 0.3 seconds

    -- Copying range (89000), (90000), progress: 89%

    -- + Will sleep for 0.3 seconds

    -- Copying range (90000), (91000), progress: 90%

    -- + Will sleep for 0.3 seconds

    -- Copying range (91000), (92000), progress: 91%

    -- + Will sleep for 0.3 seconds

    -- Copying range (92000), (93000), progress: 92%

    -- + Will sleep for 0.3 seconds

    -- Copying range (93000), (94000), progress: 93%

    -- + Will sleep for 0.3 seconds

    -- Copying range (94000), (95000), progress: 94%

    -- + Will sleep for 0.3 seconds

    -- Copying range (95000), (96000), progress: 95%

    -- + Will sleep for 0.3 seconds

    -- Copying range (96000), (97000), progress: 96%

    -- + Will sleep for 0.3 seconds

    -- Copying range (97000), (98000), progress: 97%

    -- + Will sleep for 0.3 seconds

    -- Copying range (98000), (99000), progress: 98%

    -- + Will sleep for 0.3 seconds

    -- Copying range (99000), (100000), progress: 99%

    -- + Will sleep for 0.3 seconds

    -- Copying range 100% complete. Number of rows: 100000

    -- Ghost table creation completed. Note that triggers on tpcc1000.t_test were not removed

    这个时候表上的触发器并未删除,原表和临时表都是存在的,因此还需要以下步骤:

    5. RENAME临时表回原表,并删除触发器。

    (testing)root@localhost [tpcc1000]> use tpcc1000

    Database changed

    (testing)root@localhost [tpcc1000]> set names utf8;

    Query OK, 0 rows affected (0.00 sec)

    (testing)root@localhost [tpcc1000]> rename table t_test to t_test_20140729,t_test_new_20140729 to t_test;

    Query OK, 0 rows affected (0.00 sec)

    注意这一步,一定要放在一个事务里来操作,不然有可能产生程序出错或者数据不一致的情况。

    这个执行非常的快, 但也有踩坑的时候, 如果这时有个大查询在原表,或者大的事务在原表上,不管是主库或者从库,在执行这一步时都会DELAY一会,直到获取到锁才会进行操作。

    (testing)root@localhost [tpcc1000]> drop trigger t_test_AI_oak;

    Query OK, 0 rows affected (0.00 sec)

    (testing)root@localhost [tpcc1000]> drop trigger t_test_AU_oak;

    Query OK, 0 rows affected (0.00 sec)

    (testing)root@localhost [tpcc1000]> drop trigger t_test_AD_oak;

    Query OK, 0 rows affected (0.00 sec)

    6. 如果原表是有触发器的可以将触发器恢复过来,如果无,删除临时表就结束了。

    (testing)root@localhost [tpcc1000]> desc t_test;

    +-------+------------+------+-----+---------+----------------+

    | Field | Type | Null | Key | Default | Extra |

    +-------+------------+------+-----+---------+----------------+

    | id | int(9) | NO | PRI | NULL | auto_increment |

    | o_id | int(11) | NO | | NULL | |

    | name | varchar(9) | NO | | | |

    +-------+------------+------+-----+---------+----------------+

    3 rows in set (0.00 sec)

    展开全文
  • MySql中delimiter的作用

    千次阅读 2011-11-15 13:08:08
    今天尝试用ERwin(7.2.5)在我的MySQL数据模型里创建一个触发器,发现ERwin的触发器模板自动包含生成很多很多constraint相关的代码,不确定是否有价值,先删除,增加自己业务逻辑相关的触发器执行语句。在Expanded...
  • navicat for postgresql 64位 破解版

    热门讨论 2017-12-13 10:00:27
    删除:每当从表删除一个行,触发器会被激活。 TRUNCATE:触发器定义为触发 TRUNCATE。 更新栏位:指定一个列列表。如果至少一个列在 UPDATE 命令提及为目标,触发器将会触发。 STATEMENT:指定触发器过程在每个 SQL...
  • Zookeeper 分布式锁原理

    2018-12-05 12:06:44
    临时节点: 客户端可以创建临时节点,当客户端会话终止或超时后Zookeeper自动删除临时节点。该特性可以用来避免死锁。 触发器: 当节点的状态发生改变时,Zookeeper通知监听相应事件的客户端。该特性可以用来实现...
  • MYSQL OAK ONLINE DDL

    2019-10-06 19:57:37
    2. 在原表上创建三个触发器:INSERT, UPDATE, DELETE。 3. COPY原表的数据到临时表,这个时候就算原表有数据也同时插入到临时表,这样才能保持数据的一致性。 4. 执行RENAME操作:将原表COPY成临时表,新生成的...
  • CruiseYoung提供的带有详细书签的电子书籍目录 ... SQL Server 2008编程入门经典(第3版) 基本信息 ... 15.4.4 可以在不删除的情况下关闭触发器 390 15.4.5 触发器的激活顺序 390 15.5 INSTEAD OF触发器...
  • 和传统的 t-sql书籍不同,本书以独特的 “技巧 ”形式来介绍知识点,涵盖了数据处理(增删改、视图、索引、存储过程、触发器等)、数据应用(web服务、 clr集成、分布式查询等)和数据库配置(主体、安全、数据库...
  • 当将视图/触发器/过程从一个数据库或服务器导出到另一个数据库或服务器时,通常发生这种情况,因为创建该对象的用户不再存在。您有两种选择:1.更改定义 通过DEFINER从转储中删除任何语句,这在最初导入数据库对象...
  • sql总结.doc

    2019-08-27 22:08:51
    缺点:滥用触发器会造成数据库及应用程序的维护困难。 (5)触发器的两种形式(行级触发器,表级触发器) 1.在语法上,行级触发器就多了一句话:for each row 2.在表现上,行级触发器,在每一行的数据进行操作的...
  • 9.3 创建、修改和删除索引 9.3.1 CREATEINDEX语句 9.3.2 创建XML索引 9.3.3 随约束创建的隐含索引 9.3.4 在稀疏列和地理空间列上创建索引 9.4 明智地选择——在何时何地使用何种索引 9.4.1 选择性 9.4.2 注意成本 ...
  • 9.3 创建、修改和删除索引 9.3.1 CREATEINDEX语句 9.3.2 创建XML索引 9.3.3 随约束创建的隐含索引 9.3.4 在稀疏列和地理空间列上创建索引 9.4 明智地选择——在何时何地使用何种索引 9.4.1 选择性 9.4.2 注意成本 ...
  • 书名:《ASP.NET开发实战1200例(第II卷)》(清华大学出版社....实例272 通过Delete型触发器对数据进行删除操作 实例273 触发器的嵌套使用 实例274 获取当前数据库中的触发器信息 第9章 高效的数据源文件XML...
  • PLSQLDeveloper_解压版

    2018-01-31 09:59:01
    只需在一个使用简单的表里输入信息,PL/SQL Developer会生成合适的SQL来创建和修改项目。 模板清单 PL/SQL Developer的模块清单是一个真正节约时间的并且能帮你执行标准化的工具。无论你在何时需要插一些标准的SQL...
  • plsqlplus+instantclient_11_2

    2018-01-31 10:17:42
    只需在一个使用简单的表里输入信息,PL/SQL Developer会生成合适的SQL来创建和修改项目。 模板清单 PL/SQL Developer的模块清单是一个真正节约时间的并且能帮你执行标准化的工具。无论你在何时需要插一些标准的SQL...
  • 书名:《ASP.NET开发实战1200例(第II卷)》(清华大学出版社....实例272 通过Delete型触发器对数据进行删除操作 实例273 触发器的嵌套使用 实例274 获取当前数据库中的触发器信息 第9章 高效的数据源文件XML...
  • 修复当启用重命名功能时,不显示删除按钮的问题; 修复 multipart_params 选项设置无效的问题; 当选项 multipart_params 为函数时,该回调函数使用当前文件对象作为第一个参数,默认值作为第二个参数; 文件...
  • 6.8.3 允许和禁止嵌套触发器 149 6.8.4 控制查询的执行 149 6.8.5 配置2000年的支持 150 6.9 管理数据库设置 150 6.9.1 设置索引填充 151 6.9.2 配置备份和还原超时选项 152 6.9.3 配置备份和还原保持选项 ...
  • Hibernate注解

    2015-05-06 07:24:31
    * 6.select 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用) * 例:@GeneratedValue(generator = "paymentableGenerator") * @GenericGenerator(name = "paymentableGenerator", strategy = "select...
  • Oracle Database 11g数据库管理艺术(涵盖DBA必知必的所有数据库管理知识) 基本信息 原书名: Expert Oracle Database 11g Administration 原出版社: Apress 作者: (美)Sam R.Alapati 译者: 钟鸣 杨桦 杨卫军 ...
  • 3.4.6 最终生成的HTML代码 52 3.5 改进意见 52 第二部分 管理工具和用户操作界面 55 第4章 mysql、mysqladmin和mysqldump 56 4.1 mysql 56 4.1.1 启动mysql 57 4.1.2 mysql的命令行选项 58 4.1.3 交互式使用...
  • SQL API 就扛起了统一API的大旗,批上的查询随着输入数据的结束而结束并生成有限结果集,流上的查询一直运行并生成结果流。Table & SQL API 做到了批与流上的查询具有同样的语法,因此不用改代码就能同时在...
  • 韩顺平oracle学习笔记

    2018-07-08 00:16:48
    2.oracle安装自动的生成sys和system两个用户 2 说明: 1Sys用户 是 超级用户,具有最高权限,具有sysdba角色,create database? 的权限,默认密码是manager 2System 用户 是 管理操作员,权限也很大,具有...
  • asp.net知识库

    2015-06-18 08:45:45
    根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...
  • 4.1.2 更快的DML触发器 138 4.1.3 自适应游标共享 138 4.2 新的结果高速缓存功能 140 4.2.1 使用服务器结果高速缓存提高性能 140 4.2.2 管理查询结果高速缓存 148 4.2.3 PL/SQL函数结果高速缓存 150 4.2.4 内...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

创建删除触发器会生成