zoukankan      html  css  js  c++  java
  • 触发器-- 肖敏_入门系列_数据库进阶 60、触发器(三) --youku

    https://v.youku.com/v_show/id_XMzkxOTc5NDY0OA==.html?spm=a2h0k.11417342.soresults.dtitle

    https://v.youku.com/v_show/id_XMzkyMTM1MDMxNg==.html?spm=a2h0k.11417342.soresults.dtitle

    CREATE TRIGGER v_entity_trg_u
    ON v_entity
    FOR update
    AS
        declare @old_file_id id_TY, @new_file_id id_TY, @old_file_line int, @new_file_line int
        select @old_file_id = file_id, @old_file_line = file_line from deleted
        select @new_file_id = file_id , @new_file_line = file_line from inserted
        IF @old_file_id ! = @new_file_id OR @old_file_line != @new_file_line
            BEGIN
                insert into v_entity_hist (ent_id, action, file_id, file_line, last_chg_dt)
                select ent_id, action, file_id, file_line, last_src_dt from deleted
            END
    1.
    银行信息表account,交易信息表transinfo,现增加一笔交易记录
    则account表账户余额应该变化
    2.
    这两个过程是一个整体,要么都执行,要么都不执行
    begin transaction
        向交易信息表插入数据
        在账户表中修改数据
    Commit transaction
    如果失败
    Rollback transaction

    触发器:只要用户向交易信息表中插入了数据,系统会自动在账户表中修改数据
           自动执行,整个过程是一个事务
           
    Create TRIGGER trigger_name
    ON table_name [with encryption]
    FOR {[insert/update/delete]}
    AS
        SELECT sentence
    GO    
    ------------------------------------eg--------------
    id从一万开始
    create table Account
    (
        id int identity(10000, 1) primary key,
        name nvarchar(16) not null,
        balance int not null,---money left
    )
    create table TransInfo
    (
        id int identity(1, 1) primary key,
        accountId int not null,
        [type] int not null, -- 1 deposit 0 withdraw
        amount int not null,
        createDatetime datetime not null
    )
    alter table TransInfo  -- 建立约束
    add constraint FK_ACCOUNTID foreign key (accountId)
        references Account(id);

    insert into dbo.Account
    select '郭靖' 5000 union
    select '黄蓉' 10000

    --针对新增交易记录,修改账户表的余额
    create trigger tg_transinfo_insert
    on TransInfo
    for insert
    as
        --需要从新插入的数据中,取出交易数据
        --账户编号,交易金额,交易类型
        --系统有2临时表:inserted 存放最新加入的数据
                        --deleted 存放被删除的或被修改的原始数据
        declare @accId int, @amount int, @type int
        select @accId=accountId, @type=type, @amount=amount
        from inserted  --拿到新加入的数据
        
        if(@type = 0)
        begin
            set @amount = @amount * -1;
        end
        update Account
        set balance = balance + @amount
        where id = @accId
    go
    触发器不用手动调用
    当insert会自动调用
    insert into TransInfo
    select 10000, 0, 100, GETDATE()

    declare @old_file_id id_TY, @new_file_id id_TY, @old_file_line int, @new_file_line int
        select @old_file_id = file_id, @old_file_line = file_line from deleted
        select @new_file_id = file_id , @new_file_line = file_line from inserted
        IF @old_file_id ! = @new_file_id OR @old_file_line != @new_file_line
            BEGIN
                insert into v_entity_hist (ent_id, action, file_id, file_line, last_chg_dt)
                select ent_id, action, file_id, file_line, last_src_dt from deleted
            END
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

  • 相关阅读:
    在c++代码中执行bat文件 【转】
    华为交换机限速配置命令2016
    zabbix报错listener failed: zbx_tcp_listen() fatal error: unable to serve on any address
    shell脚本中执行mysql 语句,去除warning using a password on the command line interface can be insecure信息
    zabbix_get :command not found 解决办法
    CentOS7 升级到7.4
    jumpserver v0.5.0 创建用户和管理机器
    zabbix触发的多条件判断表达式
    nginx 配置一个文件下载服务
    ECS 实例网络带宽
  • 原文地址:https://www.cnblogs.com/books2read/p/11245967.html
Copyright © 2011-2022 走看看