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
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

  • 相关阅读:
    “XXXXX” is damaged and can’t be opened. You should move it to the Trash 解决方案
    深入浅出 eBPF 安全项目 Tracee
    Unity3d开发的知名大型游戏案例
    Unity 3D 拥有强大的编辑界面
    Unity 3D物理引擎详解
    Unity 3D图形用户界面及常用控件
    Unity 3D的视图与相应的基础操作方法
    Unity Technologies 公司开发的三维游戏制作引擎——Unity 3D
    重学计算机
    windows cmd用户操作,添加,设备管理员组,允许修改密码
  • 原文地址:https://www.cnblogs.com/books2read/p/11245967.html
Copyright © 2011-2022 走看看