存储过程,类似于类,但又不太一样

他是把一个或者一组SQL语句只进行一次编译,后储存在服务器的数据库里,之后就可以直接通过调用名字了,执行特定的功能;1、减少了编译SQL的时间,提高了效率和2、代码的复用性和可移植性3、减轻服务器的负担4、可以更有效的管理数据库权限

缺点:专门维护他,占据数据空间

--即时生效,不具备原子性,不像事务,
--创建一个带参数的储存过程
create proc addTest
@Tname nvarchar(50),
@age int
as
begin
--SQL
declare @time datetime--定义变量
select @time=getdate()--赋值
insert into test(Tname,age,datetime)
values (@Tname,@age,@time)
select * from test
end

--调用存储过程
exec addTest 'ty',6



exec selectTest

use TestDB


alter table test
add datetime time

--创建触发器
create trigger trigger_test
on test
for update
as 
declare @id int,@name varchar(50),@age int--定义
select @id=id,@name=Tname,@age=age from deleted 
print '修改前:'+convert(varchar,@id)+','+@name+','+convert(varchar,@age);
select @id=id,@name=Tname,@age=age from inserted
print '修改后:'+convert(varchar,@id)+','+@name+','+convert(varchar,@age);
--没有备份表则创建备份表
--select * into testInfo
--from deleted
--把deleted表里的数据(只有刚刚执行的数据)插入备份表
--insert into testInfo(Tname,age,datetime)select Tname,age,datetime from deleted
delete from test where id=11

--先进行更改操作,触发触发器,触发器进行,把更改前的数据存入deleted,更改后的数据存入inserted
--deleted,inserted,这两个表都是虚拟表,只读,当触发器结束后就这两个表就注销了,最后执行原本的更改操作。
update test set Tname='jhi',age=2
where id=9



alter trigger delete_test
on test
for delete
as
declare @id int,@name varchar(50),@age int
select @id=id,@name=Tname,@age=age from deleted
print('删除:')+convert(varchar,@id)+','+@name+','+convert(varchar,@age)
if(object_id('testBackup','U')is not null)--‘U’对线类型是表
insert into testBackup select 
Tname,age,datetime from deleted--标识列不能显式插入标识列,所以这里不能插入id
else
select id,Tname,age,datetime into testBackup from deleted
print'备份成功!'

delete from test where id=23

 

posted on 2023-04-24 17:58  阿霖找BUG  阅读(13)  评论(0编辑  收藏  举报