存储过程和触发器

存储过程和触发器

【存储过程的定义】
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。

【存储过程的优点】
1、更快的速度
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2、代码重用,避免代码冗余
当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
开发人员进行数据库操作时,仅需要调用定义好的存储过程就可以了
3、提高安全性
一些敏感的数据直接在数据层完成,数据层可以对其进行权限控制,提高安全性

【触发器】
google得如下文章:
地址:http://fishermen.javaeye.com/blog/24026

触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
【 强化约束 Enforce restriction】
触发器能够实现比CHECK 语句更为复杂的约束。

【跟踪变化Auditing changes】
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。

【级联运行 Cascaded operation】
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。

【存储过程的调用 Stored procedure invocation】
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。

fishermen已经说得差不多了,补充一点:触发器也好,存储过程也好,这些都是一堆SQL,只是将一些业务流程、控制流程或基于规则的数据和业务控制功能封装在数据库层

视图的定义及其4个优点

视图的定义及其4个优点
【视图的定义】
视图是从一个或几个基本表(或视图)导出的表,它是一个虚表。数据库中存储了视图的定义,视图所显示的数据依然存放在原来的基本表中。
视图和基本表一样可以被查询、删除。在一个视力之上再定义新的视图,此时对视图的更新操作(增加,删除,修改)操作则有一定的限制

ps: 个人觉得视图是一个类似于窗口或接口性的东西

【简化用户操作】
视图可以将用户的注意力集中到所关心的数据上。可以通过定义视图让数据库看起来结构简单清晰,并且可以简化用户的查询操作

【聚集数据】
视图可以让不同的用户以不同的方式看待同一数据,特别是当许多不同的用户共享同一个数据库时

【一定程度的松耦合】
定义视图可以在一定程度上保持基本表的物理独立性,当修改数据的基本表时,只需要修改视图的定义而不用修改用户的应用程序;这里的不影响只是一定程度上的,当应用程序中有修改数据的操作时,则可能需要修改应用程序。这在一定程序让保证了数据的逻辑独立性。

【一定程序的安全保护】
由于视图的聚集数据的作用,对不同的人定义不同的视图,保证用户只能看到他可以看到的数据。也就是说,通过视图将要保密的数据对无权查看地的用户隐藏起来,从而在一定程度上对数据朝代安全保护。

第一次用zend framework遇到的一些问题

1、出现错误 Zend_Controller_Dispatcher_Exception: Invalid controller specified (error) in Standard.php on line 242
此时是应用程序出错,zend framework在默认情况下将错误指向error controller,而此时却没有创建此contraller,所以会出现此问题。
解决方案是在controller下面建立ErrorController.php 加errorAction事件;并在views/scripts建立文件夹error,建立error.phtml文件

2、在apache中使用别名浏览zend framework创建的项目时,可能存在路由不通的情况,
即文件夹的名字要与路径名字对应,如果你是http://localhost/zf/public/customers
这样的访问路径,则项目根目录应该是zf,index.php所在的目录是public

3、.htaccess文件无法生效,可能存在的问题:
apache的mod_rewrite没有开启,
或者.htaccess文件语法错误,比如说在[NC,L]这种格式中加一个空格,出现错误的单词;不过此种情况下会报错:Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request.
或者,在apache的配置中 Options 没有设置为FollowSymLinks, AllowOverride 没有设置成All
或者,在apache的错误日志中显示 Invalid command ‘RewriteEngine’, perhaps misspelled or defined by a module not included in the server configuration
这个是没有开启mod_rewrite模块,加载rewrite模块,在httpd.conf文件里最后加上如下代码:
LoadModule rewrite_module modules/mod_rewrite.so
或者原本配置文件中的就有这行代码,只不过是注释了,也可以直接去掉LoadModule rewrite_module modules/mod_rewrite.so前的注释“#”

这些都是有可能出问题的。

4、权限问题
将zend framework的library放在没有权限的目录,比如说放在php.ini中的open_basedir以外的地方等等

5、出现404错误
可能是apache的DocumentRoot设置问题(如果是使用别名调试)