日期:2014-05-18  浏览次数:20465 次

请问自定义函数可以操作数据库里的数据吗。
有点搞不清楚函数,存储过程,触发器,还有视图之间关系。
有没有横向对比的东西。

------解决方案--------------------
一、存储过程 
是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。 
存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。 
可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 
1.可以在单个存储过程中执行一系列 SQL 语句。 
2.可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。 
3.存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。 

二、触发器 
是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或 DELETE。触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。例如,可以控制是否允许基于顾客的当前帐户状态插入定单。 
触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。有关详细信息,请参见表关系。 
触发器的优点如下: 
1.触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。 
2.触发器可以通过数据库中的相关表进行层叠更改。例如,可以在 titles 表的 title_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键,在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。 
3.触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是,触发器可以引用其它表中的列。例如,触发器可以回滚试图对价格低于 10 美元的书(存储在 titles 表中)应用折扣(存储在 discounts 表中)的更新。 


简单来说:
1.存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合. 存储过程单独存在于数据库中,需要手工调用 。
2.触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。 允许为任何给定的 INSERT、UPDATE 或 DELETE 语句创建多个触发器。 触发器依赖于库中的某个表而存在,当表中的数据发生变化时,自动触发触发器工作
------解决方案--------------------
当然可以,不过那是针对你的数据库开发的专用函数.

函数,主要用来传入一些值,经处理后得到返回值.
触发器,主要用来在对表进行插入更新删除时进行的一些附加操作
视图,即一个预先写好的查询语句
存储过程,可以用来在数据库中做各种你想做的事情.
------解决方案--------------------
1、存储过程是程序化的sql可以实现一般sql不能实现的功能。
如:先检索一个表得到一些数据,经过一定的编辑后更新到另外一个表中、这就可以用不带参数的存储过程实现。
2、视图是虚拟表,不存储数据,存储的是sql,检索他的时候实际上是执行定义它的sql语句。

说明:从你的问题上可以看出,你使用存储过程仅仅是用它检索数据,所以你会产生这样的疑问,一定要记住,存储过程理解的简单一点就是“数据库中的程序”,可以在不需要外部程序(如C,java,vb等)的情况下,让数据库自己解决复杂的、用一般sql不能实现的功能,而视图则不然。

------解决方案--------------------
另回复标题:自定义函数不能更改数据,只能查询数据.