SQL server 中的“三剑客”
在数据库的开发中,有三个最常用,也是最重要的对象,被称之为开发中的“三剑客”。它们是:存储过程、事务、触发器。
对于初学者而言,能否熟练地运用这三个对象,是考验你能否迈入商业开发的门槛。
存储过程:
存储过程是在数据库的开发中,使用的频率最高的对象。它是将一组数据存取语句、流程控制语句、错误处理语句等,经过“打包”后,放置于数据库中,供客户端调用。
我们在客户端对数据库进行一个操作时,至少要用一道SQL语句。即便是一条语句,也有可能在多个模块中重复使用,那我们如何高效、规范、安全、易于维护的来使用这些语句,就成了一个非常重要的问题。
存储过程就能完美地解决上述的问题。它在使用上颇具弹性,优势明显。
首先是执行效率高。因为SQL server会先将存储过程编译成执行计划,并保存起来,这样每次调用时就不需要重新编译,这对高强度的人机交互,效果是明显的。
其次是对数据库的操作规范而统一。这是因为从客户端的多个模块中,有可能会对数据库作相同的操作,使用存储过程就可以避免在开发过程中或后期的维护中,因考虑不周而产生的歧义。
再有它的安全性好。因为它是一个对象,所以可以对它进行权限设置,这是单纯用SQL语句难以做到的。我们还可以对它进行加密,从而也避免了在客户端被反编译的问题,也有效地防止了注入式的攻击。
举个例子:在我们最熟悉的医院HIS系统中,您所挂的那个号,不只有号码与姓名,它还包含了很多相关的信息,它被大多数的工作站所使用。如果,我们在每个模块中,都写上一道select号的语句,是非常繁杂的事情。如果将这道语句,做成存储过程,放置于数据库中,由各个工作站直接调用,将是既规范又便捷的事。同时,也方便了今后的维护与扩展。
事务:
对于商业应用来说,可靠性总是第一位的,其次,才是安全和性能。如果可靠性不好,就什么都谈不上了。
就网络数据库而言,网络是不稳定的(相对而言),多种因素都会影响到数据在网络上的传输。这就有可能一次提交多道SQL语句时,会有部分的失败;同时,也可能出现多个用户,同时对同一个表进行操作,就有可能产生冲突,也会产生类似的问题。可是逻辑上的应用,要求我们要么都成功,要么都取消,这一点我想是不难理解的。
这时事务就可以发挥作用了。事务的原理,是建立一个回滚机制,先将SQL语句中相关的表进行锁定,然后再执行操作。如果在执行过程中发生了错误,就进行回滚,返回到锁定前的状态。另外,事务还支持嵌套使用,无论在任何一层发生错误,都将从里至外地回滚。这样,通过这个机制,我们就可以确保对数据库进行可靠、完整、有效地操作。
举例:我们在刷卡购物时,至少要进行两个操作。第一先是将卡中的货款减去,第二是将货物从库存中减去,这两个操作必需同时完成。但有时在我们进行交易时,其它客户在我们付完款之后,先于我们将货物买光,这就产生了问题。如果我们使用了事务,就可以有效避免这类问题。它可以在付款时就对库存进行锁定,避免货物被别人买走;如果确实因库存原因,它还可以进行回滚,将您的货款返还到卡中。
从这个事例中,大家可以感受到事务对于商业应用来说,是何等的重要。
触发器:
触发器是与数据表紧密结合的一种存储过程。当对表进行insert、update、delete操作时,它会被触发,并自动地执行。
在实际的应用中,要避免数据出错,验证是必不可少的。我们可以利用触发器,来对该表所做的更新,进行逻辑验证,一旦发现错误,就可以利用事务进行回滚;同时它还可以对其它相关的数据表,做更进一步的操作。
举例:人员资料表中,有身份证号和出生日期。这个身份证号的第7~14位,同出生日期有对应的关系。这个验证过程,既可以在放在客户端进行,也可以在放在触发器中进行。但放在触发器中,可以避免在多个客户端的模块中重复。当然,这只是一个简单的验证。
触发器还可以完成复杂的验证。有时一个表可能涉及到多个相关的应用,就会形成各自的验证逻辑。那在不同的模块中进行分别的验证,就远不如在触发器中进行集中的验证,来得方便与合理,同时也便于后期的维护。
另一个例子:有两张表,学生花名册和学生成绩单,这是一对多的关联表。每当在学生花名册中添加新生时,就要在学生成绩单中添加,数学、物理、化学、英语、语文这五条记录。如果我们在学生花名册中使用了触发器,那么在添加新生时,它就会自动地替我们在学生成绩单中,添加对应的五条记录。对这种强相关的表,使用触发器来操作,是最合适不过的了。
当然,触发器的功能远不止这些,这只是最常用的两种而已。
我在这篇文章中对这三个对象,做了一个概括性的介绍。如果大家想学习,还是要找来参考书,书上会有更详细、更专业的讲解,并提供一些例子,来加深您的理解。
总之,要想真正掌握这些技术,还是要动手练习。只有通过练习,您才能真正体会到这三个对象的威力。