MSSQL触发器基础(在触发器遍历所有数据)
最近很懒,也有忙的原因~~一些东西懒得发上来了·~~还是要写上来才可以,不然学到的东西以后我就忘记了
以下只保证在MSSQL下顺利执行~~可能在MySql不太一样。
最近在做作业的时候想用用数据库的触发器写写~发觉还不是一般的烦呀~~变量多了就觉得有点烦了~~不过语言还是挺容易上手的~~
插播一句:ID自增的写法
CREATE TABLE ritem( id INT IDENTITY(1,1) );
触发器的基本写法
CREATE TRIGGER 触发器名 ON 数据表名 FOR (INSERT|update|delete) AS BEGIN 在这里写代码 END
定义变量,并赋值
CREATE TRIGGER t_insert_ritem ON ritem FOR INSERT AS BEGIN DECLARE @id INT SELECT @id=id FROM inserted -- 从插入的数据获得ID的值,还有一个deleted -- inserted表示新的数据,deleted表示旧的数据(自己理解的,不知道对不对?) SET @id = @id - 1 -- 另一种赋值 PRINT @id -- 可以把值打印出来,在查询分析器结果可以看到 raiserror('抛出错误 id的值为:%d',16,1,@id) -- 也可以这样输出 IF (@id<0) BEGIN ROLLBACK TRANSACTION -- 回滚事务 END IF EXISTS(SELECT * FROM ritem WHERE id=@id) BEGIN -- 还可以用exists来判断是否为空 END END CREATE TRIGGER TRIGGER_Update ON ritem FOR UPDATE AS IF UPDATE(UserName) BEGIN -- 判断UserName有没有更新 END
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据
2.删除操作(Delete)
Inserted表无数据,Deleted表有数据
3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)
当你更新一个数据想要把相关联的所有数据都更新的时候就要用游标(CURSOR)鸟~~MSSQL的遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 | DECLARE @id INT, @rid INT DECLARE cur_tmp CURSOR FOR SELECT id,rid FROM ritem OPEN cur_tmp FETCH NEXT FROM cur_tmp INTO @id,@rid -- 这里是取到select的值 WHILE @@FETCH_STATUS = 0 BEGIN -- 在这中间加入循环 FETCH NEXT FROM cur_tmp INTO @id,@rid END CLOSE cur_tmp DEALLOCATE cur_tmp -- 释放游标 |
呵呵,看着迷糊
871105