分类: 开发

触发器设计技巧与实例

  在数据库设计中,有两种方法可设定自动化的资料处理规则,一种是条件约束,一种是触发器,一般而言,条件约束比触发器较容易设定及维护,且执行效率较好,但条件约束只能对资料进行简单的栏位检核,当涉及到多表操作等复杂操作时,就要用到触发器了。
  一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:
虚拟表Inserted 虚拟表Deleted

在表记录新增时 存放新增的记录 不存储记录
修改时 存放用来更新的新记录 存放更新前的记录
删除时 不存储记录 存放被删除的记录

触发器的种类及触发时机
After触发器:触发时机在资料已变动完成后,它将对变动资料进行必要的善后与处理,若发现有错误,则用事务回滚(Rollback Transaction)将此次操作所更动的资料全部回复。
Istead of 触发器:触发时机在资料变动前发生,且资料如何变动取决于触发器现在介绍一下创建触发器的编写格式:

After类型:
Create Trigger 触发器名称
on 表名
after 操作(insert,update)
as
Sql语句

Instead类型
Create Trigger 触发器名称
on 表名
Instead of 操作(update,delete)
as
Sql语句

实例1:
  在订单(表orders)中的订购数量(列名为num)有变动时,触发器会先到客户(表Customer)中
取得该用户的信用等级(列名为Level),然后再到信用额度(Creit)中取出该等级
许可的订购数量上下限,最后比较订单中的订购数量是否符合限制。

代码:
Create Trigger num_check
on orders
after insert,update
as
if update(num)
begin
if exists(select a.* from orders a join customer b on a.customerid=b.customerid
join creit c on b.level=c.level
where a.num between c.up and c.down)
begin
rollback transaction
exec master..xp_sendmail 'administrator','客户的订购数量不符合限制'
end
end

实例2:
有工资管理系统中,当公司对某员工甲的月薪进行调整时,通常会先在表员工中修改薪资列,然后在表员工记录中修改薪资调整时间与薪资

Create trigger compensation
on 员工
after update
as
if @@rowcount=0 return
if update(薪资)
begin
insert 员工记录
select 员工遍号,薪资,getdate()
from inserted
end

Response.ContentType的类型小集 [MIME]

ez=application/andrew-inset
hqx=application/mac-binhex40
cpt=application/mac-compactpro
doc=application/msword
bin=application/octet-stream
dms=application/octet-stream
lha=application/octet-stream
lzh=application/octet-stream
exe=application/octet-stream
class=application/octet-stream
so=application/octet-stream
dll=application/octet-stream
oda=application/oda
pdf=application/pdf
ai=application/postscript
eps=application/postscript
ps=application/postscript
smi=application/smil
smil=application/smil
mif=application/vnd.mif
xls=application/vnd.ms-excel
ppt=application/vnd.ms-powerpoint
wbxml=application/vnd.wap.wbxml
wmlc=application/vnd.wap.wmlc
wmlsc=application/vnd.wap.wmlscriptc
bcpio=application/x-bcpio
vcd=application/x-cdlink
pgn=application/x-chess-pgn
cpio=application/x-cpio
csh=application/x-csh
dcr=application/x-director
dir=application/x-director
dxr=application/x-director
dvi=application/x-dvi
spl=application/x-futuresplash
gtar=application/x-gtar
hdf=application/x-hdf
js=application/x-javascript
skp=application/x-koan
skd=application/x-koan
skt=application/x-koan
skm=application/x-koan
latex=application/x-latex
nc=application/x-netcdf
cdf=application/x-netcdf
sh=application/x-sh
shar=application/x-shar
swf=application/x-shockwave-flash
sit=application/x-stuffit
sv4cpio=application/x-sv4cpio
sv4crc=application/x-sv4crc
tar=application/x-tar
tcl=application/x-tcl
tex=application/x-tex
texinfo=application/x-texinfo
texi=application/x-texinfo
t=application/x-troff
tr=application/x-troff
roff=application/x-troff
man=application/x-troff-man
me=application/x-troff-me
ms=application/x-troff-ms
ustar=application/x-ustar
src=application/x-wais-source
xhtml=application/xhtml+xml
xht=application/xhtml+xml
zip=application/zip
au=audio/basic
snd=audio/basic
mid=audio/midi
midi=audio/midi
kar=audio/midi
mpga=audio/mpeg
mp2=audio/mpeg
mp3=audio/mpeg
aif=audio/x-aiff
aiff=audio/x-aiff
aifc=audio/x-aiff
m3u=audio/x-mpegurl
ram=audio/x-pn-realaudio
rm=audio/x-pn-realaudio
rpm=audio/x-pn-realaudio-plugin
ra=audio/x-realaudio
wav=audio/x-wav
pdb=chemical/x-pdb
xyz=chemical/x-xyz
bmp=image/bmp
gif=image/gif
ief=image/ief
jpeg=image/jpeg
jpg=image/jpeg
jpe=image/jpeg
png=image/png
tiff=image/tiff
tif=image/tiff
djvu=image/vnd.djvu
djv=image/vnd.djvu
wbmp=image/vnd.wap.wbmp
ras=image/x-cmu-raster
pnm=image/x-portable-anymap
pbm=image/x-portable-bitmap
pgm=image/x-portable-graymap
ppm=image/x-portable-pixmap
rgb=image/x-rgb
xbm=image/x-xbitmap
xpm=image/x-xpixmap
xwd=image/x-xwindowdump
igs=model/iges
iges=model/iges
msh=model/mesh
mesh=model/mesh
silo=model/mesh
wrl=model/vrml
vrml=model/vrml
css=text/css
html=text/html
htm=text/html
asc=text/plain
txt=text/plain
rtx=text/richtext
rtf=text/rtf
sgml=text/sgml
sgm=text/sgml
tsv=text/tab-separated-values
wml=text/vnd.wap.wml
wmls=text/vnd.wap.wmlscript
etx=text/x-setext
xsl=text/xml
xml=text/xml
mpeg=video/mpeg
mpg=video/mpeg
mpe=video/mpeg
qt=video/quicktime
mov=video/quicktime
mxu=video/vnd.mpegurl
avi=video/x-msvideo
movie=video/x-sgi-movie
ice=x-conference/x-cooltalk

关于byval

为什么一个结果是0,一个是10?
第一段:

Private Sub Form_Click()
    Dim a As Integer
    For i = 1 To 10
        Call abcd(a)
    Next i
    Print a
End Sub

Sub abcd(ByVal x)
    x = x + 1
End Sub

第二段:


Private Sub Form_Click()
    Dim a As Integer
    For i = 1 To 10
        Call abcd(a)
    Next i
    Print a
End Sub

Sub abcd(x)
    x = x + 1
End Sub

byval是把内存数值的拷贝给程序,所以改变的只是拷贝,内存原来的值是不会改变的。
第一个a的值并没有变化。

SQL存储过程部分参数

参数值的类型的意义如下:

名称值 整数值 功能
addbtimestamp 135 日期时间数据类型
addecimal 14 十进制整数值
addouble 5 双精度小数值
aderror 10 系统错误信息
adguid 72 全域性唯一识别字(globallyuniqueidentifier)
addispath 9 com/ole自动对象(automationobject)
adinteger 3 4字节有符号整数
adiunknown 13 com/ole对象
adlongvarbinary 205 大型2字节值
adlongvarchar 201 大型字符串值
adlongvarwchar 203 大型未编码字符串
adnumeric 131 十进制整数值
adsingle 4 单精度浮点小数
adsmallint 2 2字节有符号整数
adtinyint 16 1字节有符号整数
adunsignedbigint 21 8字节无符号整数
adunsignedint 19 4字节无符号整数
adunsignedsmallint 18 2字节无符号整数
adunsignedtinyint 17 1字节无符号整数
aduserdefined 132 用户自定义数据类型
advariant 12 ole对象
advarbinary 204 双字节字符变量值
advarchar 200 字符变量值
advarchar 202 未编码字符串变量值
adwchar 130 未编码字符

 
方向值的意义如下:

名称值 整数值 功能
adparaminput 1 允许数据输入至该参数当中
adparamoutput 2 允许数据输出至该参数当中
adparaminputoutput 3 允许数据输入、输出至该参数当中
adparamreturnvalue 4 允许从一子程序中返回数据至该参数当中