最近很懒,也有忙的原因一些东西懒得发上来了·变量多了就觉得有点烦了还是要写上来才可以,不然学到的东西以后我就忘记了可能在MySql不太一样。
以下只保证在MSSQL下顺利执行
最近在做作业的时候想用用数据库的触发器写写~发觉还不是一般的烦呀不过语言还是挺容易上手的
插播一句: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的遍历
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 -- 释放游标