触发器的使用

--创建触发器语句

CREATE TRIGGER trigger_name
 ON table_name
 [WITH ENCRYPTION]
  FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]
 AS 
  T-SQL语句
GO
--with encryption 表示加密触发器定义的sql文本
--delete,insert,update指定触发器的类型

--创建学生表
create table student(
    stu_id int identity(1,1) primary key,
    stu_name varchar(10),
    stu_gender char(2),
    stu_age int
)
--创建insert触发器
create trigger trig_insert
on student
after insert
as
begin
    if object_id(N'student_sum',N'U') is null--判断student_sum表是否存在
        create table student_sum(stuCount int default(0));--创建存储学生人数的student_sum表
    declare @stuNumber int;
    select @stuNumber = count(*)from student;
    if not exists (select * from student_sum)--判断表中是否有记录
        insert into student_sum values(0);
    update student_sum set stuCount =@stuNumber; --把更新后总的学生数插入到student_sum表中
end
--测试触发器trig_insert-->功能是向student插入数据的同时级联插入到student_sum表中,更新stuCount
--因为是后触发器,所以先插入数据后,才触发触发器trig_insert;
insert into student(stu_name,stu_gender,stu_age)values('张三','男',30);
select stuCount 学生总人数 from student_sum;    
insert into student(stu_name,stu_gender,stu_age)values('李四','女',30);            
select stuCount 学生总人数 from student_sum;
insert into student(stu_name,stu_gender,stu_age)values('钱五','男',40);                
select stuCount 学生总人数 from student_sum;
--创建insert_forbidden,禁止用户向student_sum表中插入数据
create trigger insert_forbidden
on student_sum
after insert
as
begin
    RAISERROR('禁止直接向该表中插入记录,操作被禁止',1,1)--raiserror 是用于抛出一个错误
rollback transaction
end 
--触发触发器insert_forbidden
insert student_sum (stuCount) values(5);
--创建delete触发器
create trigger trig_delete
on student 
after delete
as
begin
    select stu_id as 已删除的学生编号,stu_name stu_gender,stu_age
    from deleted
end;
--执行一一条delete语句触发trig_delete触发器
delete from student where stu_id=1;
--创建update触发器
create trigger trig_update
on student
after update
as
begin
    declare @stuCount int;
    select @stuCount=count(*) from student;
    update student_sum set stuCount =@stuCount;
    select stu_id as 更新前学生编号,stu_name as 更新前学生姓名 from deleted
    select stu_id as 更新后学生编号,stu_name as 更新后学生姓名 from inserted
end
--创建完成,执行一条update语句触发trig_update触发器
update student set stu_name='赵六' where stu_id=2;
--创建instead of 触发器 
create trigger trig_insteadOf
on student 
instead of insert
as 
begin
    declare @stuAge int;
    select @stuAge=(select stu_age from inserted)
if(@stuAge >120)
    select '年龄更新错误' as '错误原因'
end
---------------------------------------------------------------------------------------------------
--查看数据库中所有的触发器
use 数据库名
go
select * from sysobjects where xtype='TR'


--触发器修改之前的数据
select * from deleted
--触发器修改之后的数据
select * from inserted

### Navicat 中 MySQL 触发器使用教程 #### 创建触发器的一般流程 创建触发器的过程涉及多个步骤,在Navicat Premium环境中,可以通过图形界面轻松完成这些操作。首先打开目标数据库连接并导航到所需的表[^1]。 对于具体的实现方式,假设正在使用的示例数据库为Sakila,其中包含了模拟DVD租赁业务的各种表格结构[^2]。现在考虑这样一个场景:每当有新的电影被加入`film`表时,希望自动更新另一个统计信息表中的相应条目;为此目的而设计的一个简单触发器可能看起来像这样: ```sql CREATE TRIGGER add_film_trigger AFTER INSERT ON film FOR EACH ROW BEGIN -- 假设存在名为 'statistics' 的表用来保存统计数据 UPDATE statistics SET total_films = total_films + 1 WHERE id = NEW.rating; END; ``` 上述SQL语句展示了如何定义一个名为 `add_film_trigger` 的触发器,该触发器会在每次向 `film` 表插入新行之后执行,并且会根据新增加影片的评级字段(`rating`)去修改对应的分类计数器[^4]。 #### 使用 INSTEAD OF 类型触发器 除了常见的 BEFORE 和 AFTER 类型外,MySQL 还支持一种特殊形式——INSTEAD OF 触发器,这主要用于处理视图上的 DML 操作。不过需要注意的是,这类触发器仅适用于某些特定版本和支持此特性的DBMS上[^3]。 #### 错误处理机制 如果在一个事务期间触发了某个带有错误条件判断逻辑的触发器,则整个事务将会回滚以保持数据一致性。这意味着任何违反预设规则的操作都不会影响已有的数据状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值