存储过程和触发器的使用

本文主要介绍如何在数据库后台利用存储过程,触发器来管理数据库的技术,并以Delphi做前台,SQL Server做后台的模式给出具体的实现代码。

  一、SQL交互式数据库查询语言

  交互式数据库查询语言SQL中有关表操作基本的SQL语句有如下四种:(下面分别出给四种语句的语法形式及其说明)

  (1)查询表命令

SELECT[ALL|DISTINCT]select_list

[INTO[new_table_name]]

[FROM{table_name|view_name}

[WHERE clause]

[GROUP BY clause]

[HAVING clause]

[ORDER BY clause]

[COMPUTE clause]

  4)删除命令

DELETE[FROM]{table_name|view_name}

[WHERE clause]

  其中:

table_name|view_name指定源表名或源视图名

WHERE clause给出修改条件

  二、SQL Server中存储过程和触发器的使用

  存储过程是存储在服务器上的预先编译好的SQL 语句在使用时要考虑以下问题:

  1.存储过程在第一次编译时进行语法检查,编译好的存储过程保存在高速缓存中用于调用,这样执行的速度和效率较高。

  2.存储过程由应用程序激活,不由SQL Server自动执行。

  3.一个存储过程可以用于收集数据和修改数据,但是不能同时用于两者。

  存储过程的优点是:

  1.在执行重复任务时能提高效率;

  2.使前端的应用程序共享应用逻辑;

  3.可以永久创建,也可以临时创建;

  4.可以在SQL Server启动时自动执行。

  存储过程的创建语句语法为:

CREATE PROCedure[owner.]procedure_name[;number]

[(parameter1[,parameter2]...[parameter255])]

[{FOR REPLICATION}|{WITH RECOMPILE}

[{[WITH]|{,}ENCRYPTION]]

AS sql_statements

  其中:

  proceddure_name〓〓为过程名称

  ;number〓〓用于在过程名称重复时进行编号

  [(parameter1[,parameter2]...[parameter255])]〓〓为参数序列

  WHTH RECOMPILE〓〓执行计划不保存的高速缓存中,每次执行过程需要重新编译

  ENCRYPTION〓〓加密syscomments表的内容,syscomments表中包含CREATE PROCedure的文本,保证无论何时都不删除syscomments表

  FOR REPLICATION〓〓过程在前台执行,不在服务器上执行

  下面的SQL语句在MYDATABASE数据库上创建存储过程my_store_pro1

  USE MYDATABASE

  以下须是一个独立的查询模块,因为CREATE PROCDURE语句须是查询模块的首行。

  CREATE PROCDURE my_store_pro1

  @my_paral char,

  @my_para2 int

  AS

  SELECT*FROM my_table1

  WHERE [email protected]_para1

  AND my_table.1no2<[email protected]_para2

  GO

  执行存储过my_store_pro1

EXEC my_store_pro1&

触发器是一种特殊的存储过程,无论何时要对它所保护的表进行修改时它就自动执行。触发器由SQL Server自动执行,不能由应用程序调用,便于保护数据库的完整性和完全性。其语法结构为:

  CREATE TRIGGER [owner.]trigger_name

  ON[owner.]table_name

  FOR {INSERT,UPDATE,DELETE}

  [WITH ENCR YPTION]

  AS

  IF UPDATE(column_name)

  [{AND|OR}UPDATE(column_name)...]sql_statements

  其中:

  trigger_name〓〓指定触发器的名称

  table_name〓〓指定触发器所在的表名

  INSERT,UPDATE,DELETE〓〓指定触发条件

  ENCRYPTION〓〓加密syscomments表的内容,syscomments表中包含CREATEPROCedure的文本,保证无论何时都不删除syscomments表,sql_statementw是在表的内容有修改(UPDATE)时引起的动作以下是一个修改触发器,如果my_tabel的nolmy_table1字段有修改,给出错误提示。

  CREATE TRIGGER test

  ON my_tablel

  FOR UPDATE

  AS

  IF UPDATE(nol)

  BEGIN

  PRINT(不能修改此列数据’)

  END

  以下插入触发器在TITLE_L有数据增加时,给末对NO_LOCAL赋值的记录赋值,其值是现有记录中NO_LOCAL的最大值加1(NO_LOCAL为字符串类型)

  CREATE TRIGGER add_no

  ON TITLE_L

  FOR INSERT

  AS

  DECLARE @tmpl int

  SELECT @tmpl=MAX(CONVERT(int,NO_LOCAL))FROM TITLB_L

  SELECT @[email protected]+1

  DECLARE @tmpstr char(4)

  SELECT @tmpstr=CONVERRT(varchar(4),@tmpl)

  UPDATE TITLE_L

  SET [email protected] WHERE NO_LOCAL=NULL

  三、应用实例介绍

  以下给出的程序段功能为:在前台Delphi环境下调用存储过程,在服务器由表dbo.all选出符合用户身份的记录生成表dbo.today;由触发器删除部分不合日期要求的记录;再从前台用批量记录移动把dbo.today的内容下载的本地LOCALDATA数据库上data.dbf表。

  {在服务器的MYDATA数据库上创建存储过程my_store_prol:}

  CREATE PROCDURE my_store_prol

  @secu_id int

  AS

  SELECT*FROM all

  WHERE my_table1.no1<[email protected]_id

  GO

  {在MYDATA数据库的表dbo.today上创建触发器:}

  CREATE TRLGGER add_no

  ON today

  FOR INSERT

  AS

  DELETE*FORM today

  WHERE riqi  GO

  {在前台程序中执行存储过程my_store_prol:}

  Databasel.AliasName:=‘MYDATA‘;

  Databasel.DatabaseName;=‘my_databa

se‘;

  Database1.connected;=True;

  SourceTable1.DatabaseName;=‘my_database‘;

  SourceTable1.TableName=‘dbo.today‘;

  SourceTable1.Active;=True;

  StoredProc1.DatabaseName;=‘My_database‘;

  StoredProc1.StoredProcName:=‘my_proc‘;

  StoredProc1.Params.Clear;

  StoredProc1.Params.CreateParam(ftInteger,‘secu_id‘,ptInput);

  StoredProc1.Prepare;

  StoredProc1.ExecProc;

  {在前台程序中下载dbo.today的内容到data.dbf表:}

 Database2.AliasName:=‘LOCALDATA‘;

  Database2.DatabaseName:=‘local_data‘;

  Database2.connectde:=True;

  DestinTable1.DatabaseName:=‘local_data‘;

  DestinTable1.TableName:=‘data.dbf;

  DestinTable1.Active:=True;

  BatchMovel.Mode:=batAppend;

  BatchMovel.RecordCount:=0

  BatchMovel.Source:=SourceTable1;

  BatchMovel.Destination:=DestinTable1;

  BatchMovel.Execute;

时间: 2024-10-31 15:37:12

存储过程和触发器的使用的相关文章

存储过程和触发器——MySQL

从MySQL5.0版本开始就对存储过程和触发器进行了支持,在MySQL进行学习前,先查看您所使用的版本吧,方法有: 1.$mysql -V  //linux终端下 2.select version();  //mysql下 3. mysql --help | grep Distrib  //linux终端下 在了解您所使用的版本支持情况下再下一步 存储过程  sql语句执行的时候要先编译,然后执行.存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数

mysql 自定义存储过程和触发器

mysql 自定义存储过程和触发器 --存储过程示范 DROP PROCEDURE IF EXISTS PRO_TEST; CREATE PROCEDURE PRO_TEST(IN NUM_IN INT,OUT NUM_OUT INT,INOUT NUM_INOUT) BEGIN //DO ANYTHING YOU WANT END; 参数解释: in : 就是输入参数,输入参数是会被传入到存储过程作为参数使用,改变它的值将不会改变其原本值,相当于是值传递 out: 此为输出参数,在存储过程中为

MSSQL 事务,视图,索引,存储过程,触发器

事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据通信系统.例如:订票.银行.保险公司以及证券交易系统等. 如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库的永久组成部分,如果事务遇到错误且必须取消或回滚,则所有数据修改均会被清除. 开始事务 BEGIN TRANSACTION 提交事务 COMMIT TRANSACTION 回

mysql的存储过程和触发器的使用 以及php中的调用方法

存储过程顾名思义,相当于一组为了完成特定功能的sql语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程的书写格式:  CREATE PROCEDURE [拥有者.]存储过程名[;程序编号]  [(参数#1,-参数#1024)]  [WITH  {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}  ] 

oracle 存储过程 ,触发器练习

/*以下代码是对emp表进行显示宽度设置 */col empno for 9999;col ename for a10;col job for a10;col mgr for 9999;col hiredate for a12;col sal for 9999;col comm for 9999;col deptno for 99;col tname for a12;set pagesize 50; //----------------------------------------------

SQL基本编程,分支语句,循环语句,存储过程,触发器

基本编程: 定义变量 declare @变量名 数据类型 赋值 set @变量名 = 值 select @变量名 = 值 取值打印 select @变量名 print @变量名 映射到结果集 打印到消息框 分支语句if @a>@bbegin 语句....endelsebeginend 循环语句注意循环四要素:初始条件,循环条件,循环体,状态改变 declare @a int;select @a = 1; while 循环条件 @a<=10begin 循环体end 存储过程: 存储过程是集中存储

Sqlserver中存储过程,触发器,自定义函数(一)

Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. 1.1存储过程的定义:存放在服务器上预先编译好的sql语句,可以给存储过程传递参数,也可以从存储过程返回值. 优点:提供了安全访问机制,比如可以将不同的存储过程的执行权限赋予权限不同的用户:改进了执行性能,因为存储过程是预编译的:减少了网络流量,因为在调用存储过程时,传递的字符串很短,没有很长的s

T-SQL应用,视图、存储过程、触发器、游标、临时表等

sqlserver常用操作: 视图.存储过程.触发器.函数 --*********************批处理********************* --[在一个批处理中存有一个语法错误,则所有的语句都无法通过编译] USE flowershopdb SELECT * FROM tb_category SELECT * FROM tb_detailed SELECT * FROM tb_product SELECT * FROM tb_shopping SELECT * FROM tb_u

mysql存储过程和触发器的应用

***********[mysql 存储过程和触发器 -- 别安驹]********************* 1.什么情况下使用存储过程? 完成一些比较麻烦的逻辑,比如多表在mysql端的cpu很空闲的情况下,用存储过程是不错的选择, 1.1.简单的存储过程示例:简单写入 DELIMITER $$ USE `curl_test`$$ DROP PROCEDURE IF EXISTS `data_s`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `

用SQL语句查找包含有某个关键字的存储过程、触发器、函数等(仅适用MS SQL SERVER)

原文:用SQL语句查找包含有某个关键字的存储过程.触发器.函数等(仅适用MS SQL SERVER) 第一种方法:利用系统表进行查询 --将text替换成你要查找的内容 select name from sysobjects o, syscomments s where o.id = s.id and text like '%text%' and o.xtype = 'P' xtype:对象类型.可以是下列对象类型中的一种: C = CHECK 约束 D = 默认值或 DEFAULT 约束 F