sql server约束和dml触发器的比较--

sql server约束和dml触发器的比较--

ID:22372251

大小:59.00 KB

页数:6页

时间:2018-10-28

sql server约束和dml触发器的比较--_第1页
sql server约束和dml触发器的比较--_第2页
sql server约束和dml触发器的比较--_第3页
sql server约束和dml触发器的比较--_第4页
sql server约束和dml触发器的比较--_第5页
资源描述:

《sql server约束和dml触发器的比较--》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、SQLServer约束和DML触发器的比较>>  这些年来,我发现许多开发者对于何时使用数据操纵语言(DML)触发器与何时使用约束感到迷惑。许多时候,如果没有正确应用这两个对象,就会造成问题。本文将为您何时使用约束和DML触发器提供一些启示,以帮助你避免我遇到的纠正问题。  何为约束和DML触发器?  约束是数据库引擎用来约束一个表或一个表关系中的数据,以维持数据库完整性的一个对象。这些约束包括CHECK、UNIQUE、PRIMARYKEY等。这里提供在TSQL中定义约束的更多细节。  AFTER触发器是一种特殊

2、类型的TSQL代码块,当一个DML语句根据触发器定义的表执行时,它得到执行。(在本文中我仅指这种触发器。)  何时使用约束和DML触发器  使用约束比使用触发器更加有利(如果你可以使用约束的话)。你总是可以写出一个触发器,完成和一个约束相同的工作,但这样做一般没有什么意义。  考虑使用一个外键约束和DML触发器。使用外键约束的目的是为了确保允许进入一个表的一列或多列的值出现在一个单独表的一列或多列中。你可以使用DML触发器建立相同的功能。  列表A建立了SalesHistory和I_SalesProducts表,

3、我将在例子中使用它们,并给它们加载一些数据。  以下为引用的内容:IFOBJECT_ID('SalesHistory')>0DROPTABLESalesHistory;GOCREATETABLE[dbo].[SalesHistory]( [SaleID][int]IDENTITY(1,1)NOTNULLPRIMARYKEY, [Product][varchar](10)NULL, [SaleDate][datetime]NULL, [SalePrice][money]NULL)GODECLA

4、REiSMALLINTSETi=1L触发器实现相同的功能。列表B在SaleHistory表中建立一个触发器,它检查在SaleHistory表中插入或更新的值是否在I_SaleProducts表中生成产品值。  以下为引用的内容:CREATETRIGGERtr_SalesHistoryonSalesHistoryFORINSERT,UPDATEASBEGINIFUPDATE(Product)ANDROINSERTEDiJOINl_SalesProductssONi.Product=s.Product)BEGINRO

5、LLBACKTRANSACTIONSELECT'DifferentResults,anerrorhasoccurred.'--//THROERRORMESSAGEENDEND  以这种方式建立解决方案还涉及许多工作。工作时间并不是你在创立这种解决方案时遇到的唯一问题。因为约束以SQLServer功能的形式建立,它们倾向于擅长完成它们旨在完成的工作,而且与在触发器中执行相同的功能相比,它们的表现也更好。  当执行一个DML操作时,系统首先启动一个INSTEADOF触发器,然后外键约束进行检查,接着再

6、运行AFTER触发器。这表示,在调用AFTER触发器前,表中定义的任何外键约束必须得到满足。  现在我们考虑你想要使用触发器而非约束的情况。在需要将表中的当前值与当前输入值进行比较,以不能满足某些极限时,就可以首选使用触发器。考虑下面的商业情形。  Mypany.最近实施了一项商业规则,如果产品的售价低于500美元,那么一天内出售的BigScreen产品的数量就不能超过5件。此举是为了保证折扣价格不会超出公司的12下一页>>>>这篇文章来自..,。期望。我们来了解满足这种条件的其中一种方法。  首先,用户界面可以

7、查询数据库,了解输入的产品数量是否超过上限。这种方法有效,但它需要在用户界面中加入额外的商业逻辑,公司可能反对这样做。  在这种情况下,可能很难实施一个约束,但如果要这样做,仍然需要增加一些额外的编程逻辑。应用触发器可以有效地解决这个问题,因为触发器擅长比较以往和当前的值,并根据这些值做出决策。列表C建立了实现这个目标的触发器。  以下为引用的内容:CREATETRIGGERtr_MaxProductSalesONSalesHistoryFORINSERT,UPDATEASBEGINDECLAREProductC

8、HAR(150)DECLARETodaySMALLDATETIMEDECLAREInsertedCountINT,CurrentCountINTDECLAREMaxRecordCountTINYINTDECLAREMinSalePriceMONEYIFROALLDATETIME)SETProduct='BigScreen'SETMaxRecordCount

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。