SQL触发器实例

合集下载

SQL触发器的使用及语法

SQL触发器的使用及语法

===以下转/blog/424789定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。

触发器是一个特殊的存储过程。

常见的触发器有三种:分别应用于Insert , Update , Delete 事件。

我为什么要使用触发器?比如,这么两个表:Create Table Student( --学生表StudentID int primary key, --学号....)Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

等等。

这时候可以用到触发器。

对于1,创建一个Update触发器:Create Trigger truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDFrom BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表Where br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。

注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。

sql 触发器if条件写法

sql 触发器if条件写法

sql 触发器if条件写法在SQL 中,触发器(Trigger)可以在表上执行自动化的操作,当满足特定事件(如插入、更新、删除)时触发。

在触发器中使用`IF` 条件通常涉及到使用`IF...THEN...ELSE` 结构或`CASE` 表达式,具体取决于你的数据库管理系统(DBMS)的支持和语法。

以下是一个简单的示例,展示了在触发器中使用`IF` 条件的一般写法:```sql-- 创建触发器CREATE TRIGGER example_triggerAFTER INSERT ON your_tableFOR EACH ROWBEGIN-- 使用IF 条件IF NEW.column_name = 'some_value' THEN-- 在此执行某些操作-- ...ELSE-- 在条件不满足时执行其他操作-- ...END IF;-- 或者使用CASE 表达式CASEWHEN NEW.column_name = 'some_value' THEN-- 在此执行某些操作-- ...ELSE-- 在条件不满足时执行其他操作-- ...END CASE;END;```在这个示例中:- `NEW.column_name` 表示插入操作中新插入的行的某个列的值。

- `AFTER INSERT ON your_table` 意味着触发器将在插入`your_table` 表中的数据后执行。

请注意,上述示例中的`IF` 条件和`CASE` 表达式中的条件和操作应根据实际需求进行修改。

具体的语法和功能可能会因使用的数据库管理系统而异,例如,MySQL、SQL Server、Oracle 等数据库系统可能具有不同的语法和支持程度。

mssql中触发器if语句的用法

mssql中触发器if语句的用法

mssql中触发器if语句的用法在mssql中,触发器是一种特殊类型的存储过程,它会在特定的表上执行定义的操作。

触发器可以用于在插入、更新或删除数据时执行自定义操作。

为了进一步控制触发器的行为,我们可以使用if语句。

if语句可以根据条件执行不同的代码块。

在触发器中使用if语句可以帮助我们根据特定的条件来执行不同的操作。

下面是一个示例,展示了mssql中触发器if语句的用法:```sqlCREATE TRIGGER [TriggerName]ON [TableName]AFTER INSERT, UPDATE, DELETEASBEGIN-- 声明并初始化变量DECLARE @Variable INTSET @Variable = (SELECT Column FROM Table)-- 使用if语句根据条件执行不同的操作IF @Variable > 10BEGIN-- 当条件满足时执行的代码块PRINT 'Variable is greater than 10'ENDELSEBEGIN-- 当条件不满足时执行的代码块PRINT 'Variable is less than or equal to 10'ENDEND```在上面的示例中,我们创建了一个触发器,并在插入、更新或删除数据时执行。

在触发器的代码块中,我们声明并初始化了一个变量@Variable,并将表中的某一列的值赋给它。

然后,我们使用if语句判断@Variable的值是否大于10,如果满足条件,则执行相应的代码块,并输出信息。

如果条件不满足,则执行另一个代码块,并输出不同的信息。

通过在mssql中使用触发器和if语句,我们可以根据特定的条件执行不同的操作。

这种灵活性可以帮助我们更好地控制和管理数据库中的数据。

但是,请注意,在使用触发器和if语句时,确保逻辑正确,并避免产生不必要的复杂性。

sqlserver 触发器示例

sqlserver 触发器示例

sqlserver 触发器示例1--检查当前触发器是否已存在2IF exists(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_INSERTUserInfo_LoginLog')3--存在即删除该触发器4DROP TRIGGER TR_INSERTUserInfo_LoginLog5go6--触发器创建在UserInfo表上当对UserInfo表执行INSERT操作后自动执行触发器中的SQL语句7CREATE TRIGGER TR_INSERTUserInfo_LoginLog8ON UserInfo9FOR INSERT10AS11BEGIN12--定义接受新建用户ID的参数13DECLARE@userID VARCHAR(50);14--查询INSERTED临时表获取新建用户ID15SELECT@userID=UserID FROM Inserted16--向用户登录日志表中添加新建用户登录日志17INSERT INTO LoginLog VALUES(@userID,getDate())18END19GO2021IF EXISTS(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_Update_UserInfo_ManagerLog')22DROP TRIGGER TR_Update_UserInfo_ManagerLog23GO24CREATE TRIGGER TR_Update_UserInfo_ManagerLog25ON UserInfo26FOR UPDATE27AS28--接受被更新用户信息的ID29DECLARE@userId INT30--接受更新前用户密码的变量31DECLARE@oldPwd VARCHAR(50)32--接受更新后用户密码的变量33DECLARE@newPwd VARCHAR(50)34--接受更新前用户邮件的变量35DECLARE@oldEmail VARCHAR(50)36--接受更新后用户邮件的变量37DECLARE@newEmail VARCHAR(50)38--从DELETED临时表中获取数据更新前用户数据39SELECT@userId=UserId,@oldPwd=password,@oldEmail=Em ail FROM Deleted40--从INSERTED临时表中获取数据更新后的用户数据41SELECT@newPwd=password,@newEmail=Email FROM Inserte d42--向系统日志表中插入数据43INSERT INTO managerlog VALUES('修改ID为:['+CAST(@use rId AS VARCHAR(5))+']用户信息:<br/>Password:{'+@oldPwd+'}-->Password:{'+@newPwd+'}<br/>Email:{'+@oldEmail+'}-->{'+@ newEmail+'}',getDate())44Go454647--创建当用户表插入新数据时,添加工资表对应记录的触发器48IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_Emp_EmpPayment')49DROP TRIGGER Insert_Emp_EmpPayment50go51CREATE TRIGGER Insert_Emp_EmpPayment52ON Employee153FOR INSERT54AS55DECLARE@empId INT56SELECT@empId=EmpId FROM Inserted57INSERT INTO EmpPayMent VALUES(@empId,800.00,null) 58go5960--创建当向工资表插入数据时,更新工资表中员工奖金61IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_EmpPayment')62DROP TRIGGER Insert_EmpPayment63go64CREATE TRIGGER Insert_EmpPayment65ON EmpPayMent66FOR INSERT67AS68DECLARE@empId INT69SELECT@empId=EmpId FROM Inserted70UPDATE EmpPayMent SET Bonus=50.00WHERE EmpID=@empId 71go。

SQL触发器实例

SQL触发器实例

SQL触发器实例1定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。

触发器是一个特殊的存储过程。

常见的触发器有三种:分别应用于Insert , Update , Delete 事件。

我为什么要使用触发器?比如,这么两个表:Create Table Student( --学生表StudentID int primary key, --学号....)Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

等等。

这时候可以用到触发器。

对于1,创建一个Update触发器:Create Trigger truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDFrom BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表Where br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。

注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。

SQL触发器实例

SQL触发器实例

SQL触发器实例16.2.3 INSERT触发器实例1 创建INSERT触发器为STUDENT表创建触发器S_insert,当向STUDENT表中插入数据时,要求学号必须以“97”开头,且课程号CNO必须在COURSE表中,否则取消插入操作。

实例代码如下。

CREATE TRIGGER S_insertON STUDENTFOR INSERT ASDECLARE @S_no V ARCHAR(4), @S_cno INTSELECT @S_no= SNO, @S_cno=CNOFROM INSERTEDIF (LEFT(@S_no,2)!='97')BEGINROLLBACK TRANSACTIONRAISERROR('输入的学号:%s不是97级的学生,请确认后重新录入!',16,1, @S_no)ENDIF(@S_cno NOT IN (SELECT CNO FROM COURSE))BEGINROLLBACK TRANSACTIONRAISERROR('输入的课程号:%d在COURSE表中不存在,请确认后重新录入!',16,1, @S_cno) END当通过如下语句向STUDENT表中插入数据时:INSERT INTO STUDENT V ALUES('9602','王永','机械工程','男',2,76,'必修')由于插入数据的学号为“9602”,并不是以“97”开头,所以执行S_insert触发器时,将执行“ROLLBACK TRANSACTION”语句,取消完成的工作,并执行RAISERROR语句给出错误信息。

运行结果如下。

输入的学号:9602不是97级的学生,请确认后重新录入!当通过如下语句向STUDENT表中插入数据时:INSERT INTO STUDENT V ALUES('9702','王永','机械工程','男',12,76,'必修')由于课程号12在COURSE表中不存在,所以执行S_insert触发器时,将执行“ROLLBACK TRANSACTION”语句,取消工作,并执行RAISERROR语句给出错误信息。

创建触发器sql语句简单例子

创建触发器sql语句简单例子在数据库中,触发器是一种特殊的存储过程,它在指定的数据库操作(如插入、更新或删除)发生时自动执行。

触发器可以用于实现数据一致性、完整性以及其他业务逻辑的需求。

本文将介绍创建触发器的SQL语句的简单例子。

在创建触发器之前,我们首先需要明确触发器要针对的表以及触发的事件类型(如插入、更新或删除)。

我们以一个简单的示例来说明,假设有两个表:`Customers`(顾客表)和`Orders`(订单表),并且要在`Orders`表中插入一条新记录时,在`Customers`表中自动更新顾客的订单数量。

以下是创建触发器的SQL语句的简单例子:```sqlCREATE TRIGGER update_order_countAFTER INSERT ON OrdersFOR EACH ROWBEGINUPDATE CustomersSET order_count = order_count + 1WHERE customer_id = NEW.customer_id;END;```解释一下上述SQL语句的具体含义:- `CREATE TRIGGER update_order_count`:创建一个名为`update_order_count`的触发器;- `AFTER INSERT ON Orders`:定义触发器在`Orders`表中插入记录后触发;- `FOR EACH ROW`:指定触发器对每一行的记录执行;- `BEGIN`和`END`之间的代码块:触发器的具体逻辑代码;- `UPDATE Customers SET order_count = order_count + 1 WHERE customer_id = NEW.customer_id;`:在触发器中执行的SQL语句,更新`Customers`表中符合条件的记录。

在上述例子中,每当在`Orders`表中插入一条新记录时,触发器会自动执行,将对应顾客的订单数量加1,并更新到`Customers`表中。

sql触发器实例

sql触发器实例触发器(Trigger)是数据库管理系统(DBMS)中的一种规则,它会在指定的数据库表发生特定事件(如插入、更新或删除)时自动执行。

下面我将为你展示一个简单的SQL 触发器示例。

示例场景假设我们有一个名为employees的表,用于存储员工信息,包括id, name, 和salary。

我们想创建一个触发器,确保每当有新员工添加时,他们的工资不能超过某个特定的值。

1.创建employees 表sqlCREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),salary DECIMAL(10, 2));2.创建触发器我们创建一个名为check_salary的触发器,当在employees表中插入新记录时,它会检查工资是否超过了5000。

如果超过了,触发器将中止插入操作。

sqlDELIMITER //CREATE TRIGGER check_salary BEFORE INSERT ON employeesFOR EACH ROWBEGINIF NEW.salary > 5000THENSIGNAL SQLSTATE'45000'SET MESSAGE_TEXT = 'Salary exceeds maximum limit';END IF;END;//DELIMITER ;在这个触发器中:•BEFORE INSERT ON employees指定了触发器是在向employees表插入新记录之前触发。

•FOR EACH ROW表示这个触发器会对插入操作中的每一行单独触发。

•IF NEW.salary > 5000检查即将插入的新记录的工资是否超过5000。

•SIGNAL SQLSTATE '45000'在工资超过限制时发出一个错误信号,中止插入操作。

3.测试触发器现在我们尝试插入一些记录来测试触发器的功能。

SQL触发器的使用及语法

SQL触发器的使⽤及语法定义:何为触发器?在SQL Server⾥⾯也就是对某⼀个表的⼀定的操作,触发某种条件,从⽽执⾏的⼀段程序。

触发器是⼀个特殊的存储过程。

常见的触发器有三种:分别应⽤于Insert , Update , Delete 事件。

我为什么要使⽤触发器?⽐如,这么两个表:Create Table Student( --学⽣表StudentID int primary key, --学号…)Create Table BorrowRecord( --学⽣借书记录表BorrowRecord int identity(1,1), --流⽔号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间…)⽤到的功能有:1.如果我更改了学⽣的学号,我希望他的借书记录仍然与这个学⽣相关(也就是同时更改借书记录表的学号);2.如果该学⽣已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

等等。

这时候可以⽤到触发器。

对于1,创建⼀个Update触发器:Create Trigger truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDFrom BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表Where br.StudentID=d.StudentIDend理解触发器⾥⾯的两个临时的表:Deleted , Inserted 。

注意Deleted 与Inserted分别表⽰触发事件的表“旧的⼀条记录”和“新的⼀条记录”。

sql数据库-触发器练习

《触发器练习》(cardID CHAR(10)primary key,--卡号customerName CHAR(8)NOT NULL,--顾客姓名currentMoney MONEY NOT NULL-- 当前余额)CREATE TABLE transInfo --交易信息表(cardID CHAR(10) NOT NULL, --卡号transType CHAR(4) NOT NULL, --交易类型(存入/支取)transMoney MONEY NOT NULL, --交易金额transDate DATETIME NOT NULL --交易日期默认为当天日期CONSTRAINT DF_transDate DEFAULT(getDate( )))GO/*--插入测试数据:张三开户,开户金额为1000 ;李四开户,开户金额1 ---*/INSERT INTO bank(customerName,cardID,currentMoney) V ALUES('张三','1001 0001',1000) INSERT INTO bank(customerName,cardID,currentMoney) V ALUES('李四','1001 0002',1)完成下列操作:1.建INSERT触发器:在交易信息表transInfo上创建插入触发器。

根据交易类型是支取/存入,减少或增加帐户表(bank)中对应卡号的余额,如果支取的金额小于1,则显示交易失败,撤销刚才的操作,否则修改信息表的信息。

程序代码:CREA TE TRIGGER transInfo_INSERTON transInfo AFTER INSERTASBEGINDECLARE @transMoney MONEY--交易金额DECLARE @CARD CHAR(10)--交易的卡号DECLARE @currentMoney MONEY--现金DECLARE @transType CHAR(4)--交易类型SET @transType=(SELECT transType FROM INSERTED)SET @transMoney=(SELECT transMoney FROM INSERTED)SET @CARD=(SELECT cardID FROM INSERTED)IF(@transType='存入')BEGINUPDA TE bank SET currentMoney=currentMoney+@transMoneyWHERE cardID=@CARDSET @currentMoney=(SELECT currentMoney FROM BANKWHERE cardID=@CARD)PRINT'交易成功!交易金额:'+CONVERT(CHAR,@transMoney)PRINT'卡号:'+@CARD+'余额:'+CONVERT(CHAR,@currentMoney)ENDELSE IF( @transType='支取')IF( @transMoney<1)BEGINPRINT'交易失败'ROLLBACK TRANSACTIONENDELSEBEGINUPDA TE bank SET currentMoney=currentMoney-@transMoneyWHERE cardID=@CARDSET @currentMoney=(SELECT currentMoney FROM BANKWHERE cardID=@CARD)SET @transMoney=-@transMoneyPRINT'交易成功!交易金额:'+CONVERT(CHAR,@transMoney)PRINT'卡号:'+@CARD+'余额:'+CONVERT(CHAR,@currentMoney)ENDEND测试数据:DELETE FROM transInfoSET NOCOUNT ONINSERT INTO transInfo(cardID,transType,transMoney)VALUES('1001 0001','支取',200)INSERT INTO transInfo(cardID,transType,transMoney)VALUES('1001 0002','存入',50000)运行结果:2.创建DELETE 触发器:在交易信息表transInfo上创建删除触发器,如果删除交易信息表的记录,将删除的记录备份到backupT able表中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

--建立触发器,显示修改人数
create trigger d1 on jun for insert,update as
select '你正在修改数据'
declare @a varchar(20)
select @a=str(@@rowcount)+'个学生被修改'
select @a
select * from jun
return
insert into jun(爱好) values('跑步')
update jun set 爱好='打球' where 学号<='103'
--建立触发器,当男生人数在6个以内可以加入,否则不能加入
create trigger i1 on zg for insert as
if((select count(性别) from zg where 性别='男')>6)
select '不能插入,男生人数已满。

'
else
select'插入成功'
select * from zg
insert into zg(学号,姓名,性别) values(20100636,'江渝','男')
--建立触发器,如果语文成绩在200以内可以修改,否则不能修改
create trigger u1 on zg for update as
if((select max(语文) from zg )>200)
begin
select '你不能修改'
rollback
end
else
select '修改成功'
select * from zg
update zg set 语文=语文+10 where 姓名='唐荣强'
update zg set 语文=语文-20 where 姓名='张军'
update zg set 语文=语文+30 where 姓名='张军'
--建立触发器,显示删除和修改的内容
create trigger d2 on zg for insert,update,delete as
select * from deleted
select * from inserted
select * from zg
delete from zg where 班级=Null
delete from zg where 姓名='张军'
--建立触发器,如果zg表中没有此人的姓名,则不能在kc表中进行修改
create trigger i2 on kc for insert,update as
if(not exists(select 姓名from zg where 姓名=(select 姓名from inserted))) begin
select '不能修改数据'
rollback
select * from kc
end
else
begin
select '修改成功'
select * from kc
end
update kc set 选修人数=选修人数+100 where 姓名='张军'
--建立触发器,更行zg时也更新kc
create trigger u2 on zg for update as
select * from deleted
select * from inserted
update kc set 姓名=(select min(姓名) from inserted )where 姓名=(select min(姓名) from deleted)
select * from zg
select * from kc
update zg set 姓名='张晓军' where 姓名='张军'
--建立触发器,如果加入的数>2000就不能插入并将默认值为500
create trigger i3 on zg for insert as
if((select 语文from inserted)>2000)
begin
select '语文>2000不合适'
update zg set 语文=500
select * from zg
rollback
end
else
select '修改成功'
insert into zg(班级,姓名,学号,语文) values('小数','王五',20100637,2500)
--建立触发器,不能删除总成绩最高的人
create trigger d3 on zg for delete as
if( select 总成绩from deleted) >= ( select max(总成绩)from zg)
begin
select '删除的数为:'
select * from deleted
select '不能删除成绩最高的一位'
rollback
end
else
select '删除成功'
select * from zg
delete from zg where 姓名='唐荣强'
--建立触发器,英语增长不超过250%
create trigger u3 on zg for update as
if(select max(英语) from inserted )/(select min(英语) from deleted)>2.5
begin
select * from deleted
select * from inserted
select '增长速度>250%不能修改'
rollback
end
else
select '修改成功'
select * from zg
update zg set 英语=英语*3 where 姓名='杨杰'
--通过触发器调用其他函数
create proc p1 as
select * from zg
create trigger u4 on zg for insert,delete,update as
exec p1
insert into zg(姓名,学号,班级)values('小王',20100638,'小语')
--多个触发器运行顺序
create trigger i5 on zg for insert,update as
select '你在插入数据'
create trigger u5 on zg for update,insert as
select '你在修改数据'
update zg set 姓名='张军' where 姓名='张晓军'
--触发器
create trigger j1 on kc for update,delete,insert
as
select( '你正在修改数据');
select * from deleted
delete from kc where 课程名称='计算机导论'
insert into kc (学号,课程名称,课程代码,学分) values('1010','计算机导论','D032T',2) update kc set 学号=1007 where 学号=1006
create trigger j2 on kc for delete
as
declare @count varchar(20)
select @count=str(@@rowcount)+'个学生被删除'
select @count
return
delete from kc where 学分=1.5
create trigger j3 on jun for insert,update
as
if(select sum(年龄) from jun )>400
begin
select '你们年龄大入要求:不予录取'
rollback
end
else
begin
select '恭喜你,你被录取了'
end
insert into jun (学号,爱好,年龄) values('111','编程',20)
update zg set 总成绩=语文+数学+英语
select * from zg
create trigger y2 on zg for insert,update
as
if( select sum(总成绩) from zg )>2000
begin
select ' 你通过了考试,欢迎你晋级'
rollback
end
else
select '很抱歉,你没有通过考试'
select * from zg
update zg set 语文=语文-50 select 语文from zg。

相关文档
最新文档