(火炬)MS SQL Server数据库案例教程(四)
otalprice=saleprice*salenum
Where smokeproductname=(select smokeproductname from inserted)
Go
----插入数据
Insert into smoke_t_sale values(‘红塔山人为峰’,’保全购货商’,20,250,0)
插入后查询结果显示 saletotalprice列由0为更新为5000.0000
(5)在smoke_t_stock表上的delete触发器
Create trigger t_delete_smoke_t_sale
On smoke_t_stock
For delete
As
Delete smoke_t_sale where smokeproductname=(select smokeproductname from deleted)
Go
---- smoke_t_stock表删除数据的同时与smoke_t_sale相关的表也同时删除相同条件的数据
--------------------------------------------------------------------------------------------------------------------------------
其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
对表的操作
Inserted逻辑表
Deleted逻辑表
增加记录(insert)
存放增加的记录
无
删除记录(delete)
无
存放被删除的记录
修改记录(update)
存放更新后的记录
存放更新前的记录
Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。
23.存储过程
在数据库中创建存储过程,SQL语句如下:
USE [数据库名称]
Create pro| procedure updatesalesMan -- updatesalesMan存储名称
@chineseName varchar(10),@englishName varchar(60),
@telephone varchar(20) ,@mobilephone(20),……
AS
Begin
Update salesman set chineseName=@@chineseName,
englishName=@englishName, telephone=@ telephone,
mobilephone=@ mobilephone,……
where salesmanID=@ salesmanID
end
go
-------------------调用存储过程----------------
cm.ExecuteNonQuery(updatesalesman,commandType.storedprocedure,parames)
-----------------存储过程的调用-----------------
//存储过程方法的调用(举例)C#代码里操作
Public datatable prosalesman(string chineseName String englishName ,string telephone ,string mobilephone,string salesmanID……)
{
Datatable dt=new Datatable();
Sqlparameter[] parames=new Sqlparameter[4];
Parames[0]=new sqlparameter(“@ chineseName”, chineseName);
Parames[1]=new sqlparameter(“@ englishName”, englishName);
……
Parames[3]=new sqlparameter(“@ salesmanID”, salesmanID);
dt=sqlhelper.ExecuteDataTable(“updatesalesman”,commandType.storedprocedure,parames);
return dt;
}
24.Transaction 事务处理(SQL)
在sQL server 数据库查询器里
Begin
Delete from [我的类别] where 类别编号=2 // 在这里 我的类别 代表表名称
If((select count(*) from [我的产品] where 类别编号=2)>3)
Begin
Rollback transaction //事物 回滚
End
Else
Begin
Delete from [我的产品] where 产品编号=2
Commite transaction //提交事物
End
---------------------------在。Net程序里(实例)-------------------
打开连接
Conn.open();
//声明一个事物
SqlTransaction trans=conn.beginTransaction();
Sqlcommand cmd=new sqlcommand();
Cmd.connection=conn;
//将事物指定给命令对象
C