资源描述:
《使用check约束执行业务规则--》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、使用CHECK约束执行业务规则>> 如果你不熟悉CHECK约束,那么习惯上它们通过限制插入到一个字段中的值来执行字段域完整性。我发现CHECK约束很不幸地被用于大多数的数据模型中。在大多数的案例中,我看到使用触发器来执行业务规则,而这本来是应该用一个CHECK约束来执行的。我个人使用CHECK而不是触发器是基于很多个原因的。首先,我不需要浪费时间来写专门的代码。另外,CHECK约束是在数据库修改通过数据库引擎完成之前执行的,然而触发器是事故发生后检查的。使用触发器延长了一个事务的生命,如果检测到一个回滚事件那么代价可能是昂贵的
2、。 SQLServer允许你定义检查单独字段完整性的字段级别的CHECK约束。此外,SQLServer允许你使用一个表级别CHECK约束来检查多个字段的值。虽然它们被归类为表级别约束,但是这些CHECK约束的类型实际上是在行级别上检查的。最后,CHECK约束通过检查一个定义好的情形来看它的值为TRUE还是FALSE。 让我们来看看一些例子。我将建立一张示例表EMPLOYEE。作为表定义的一部分,我们将执行一个公司规则:在我们的系统中没有一个员工被允许赚取超过$100,000或者少于$30,000。 CREATETABLE
3、DBO.EMPLOYEE ( EMPLOYEEIDINTIDENTITY(1,1)NOTNULL, FIRSTNAMEVARCHAR(50)NOTNULL, LASTNAMEVARCHAR(50)NOTNULL, IS_MANAGERBITNULL, SALARYMONEYNOTNULL, BONUSPCTFLOATNOTNULL ) GO ALTERTABLEDBO.EMPLOYEE ADDCONSTRAINTPK_EMPLOYEEPRIMARYKEY(EMPLOYEEID) GO ALTERTABL
4、EDBO.EMPLOYEE ADDCONSTRAINTDF_EMPLOYEE_BONUSPCTDEFAULT0.00FORBONUSPCT GO ALTERTABLEDBO.EMPLOYEE ADDCONSTRAINTCK_EMPLOYEE_SALARYCHECK(SALARYBETPLOYEE GO 查看我们表中的约束,我们看到我们简单的字段级别约束已经定义好了: 图一 尝试把值插入到SALARY字段超出了我们定义的范围,这也被我们的数据库引擎成功捕捉到了。 INSERTINTODBO.EMPLOYEE(FI
5、RSTNAME,LASTNAME,SALARY) SELECT'GEORGE','PLOYEE ADDCONSTRAINTCK_EMPLOYEE_BONUSPCT CHECK(IS_MANAGER=1ANDBONUSPCT>=5.00) GO INSERTINTODBO.EMPLOYEE(FIRSTNAME,LASTNAME,IS_MANAGER,SALARY,BONUSPCT) SELECT'GEORGE','PLOYEE(FIRSTNAME,LASTNAME,
6、IS_MANAGER,SALARY,BONUSPCT) SELECT'BEN','FRANKLIN',0,75000,2.50 GO 图三 然后发生了什么事呢?员工PLOYEE DROPCONSTRAINTCK_EMPLOYEE_BONUSPCT GO12下一页>>>>这篇文章来自..,。ALTERTABLEDBO.EMPLOYEE ADDCONSTRAINTCK_EMPLOYEE_BONUSPCT CHECK(CASEANAGER<>1ANDBONUSPCT>=
7、5.00THEN1ELSE0END=0) GO INSERTINTODBO.EMPLOYEE(FIRSTNAME,LASTNAME,IS_MANAGER,SALARY,BONUSPCT) SELECT'BEN','FRANKLIN',0,75000,2.50 GO 现在试着使用正确的CHECK约束定义来插入Franklin,结果成功了。 图四 现在让我们尝试插入一个新的员工Jefferson。 INSERTINTODBO.EMPLOYEE(FIRSTNAME,LASTNAME,IS
8、_MANAGER,SALARY,BONUSPCT) SELECT'THOMAS','JEFFERSON',NULL,80000,7.50 GO 图五 等待一秒钟,Jefferson没有被标记成一个管理人员但是他的引擎允许他