当前位置:首页 » 服务存储 » 存储过程怎么触发的
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

存储过程怎么触发的

发布时间: 2022-07-17 15:54:34

❶ 如何在存储过程中建立触发器

(1).存储过程:
create
procere
for_select(你想用的触发器名字)
delare
@name
char(8)
output(用于输出的),@age
int
output(用于输出),@phone_num
char(11)
(输入)
as
select
@name=name(列名),@age=age(列名)
from
table_name(表名)
where
phone_num(列名)=@phone_num
(2)触发器
create
tigger
for_update
on
table_name
after
update
as
if(update(phone_num))
update
table_name2
set
phone_num=i.phone_num
from
deleted
d,inserted
i
where
table_name.phone_num=d.phone_num
end
其中:deleted与inserted是sql中默认的临时表。用来储存原来的值和插入的值。本触发器的作用是
当更新table_name
中的phone_num时table_name1中的phone_num也一起更新!注意触发器只能用于update.insert.delete.select中不能用于创建表............

❷ 存储过程和触发器

PROCEDURE
p_book1
PROCEDURE p_book2
书名='大学英语'
EXEC p_book2
图书编号=@x
'001105'
varchar(20)
书籍表 where 书名=@c1
EXEC p_book4 '大学语文'

❸ 请问存储过程与触发器关系

存储过程需要调用才执行里面的sql语句。触发器是设置好触发条件,条件达到时自动运行里面的sql语句,比如对a表进行更新(update)操作时,相应的触发器就会运行。

❹ 如何用触发器调用存储过程!!

create trigger [owner.]trigger_name

on[owner.]table_name
{for insert}
as
sql_statement

顺便问下:你的rollback怎么写在begin里了

❺ 如何利用存储过程和触发器来管理数据

一、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 PROCere[owner.]procere_name[;number]
[(parameter1[,parameter2]...[parameter255])]
[{FOR REPLICATION}|{WITH RECOMPILE}
[{[WITH]|{,}ENCRYPTION]]
AS sql_statements 其中: procedre_name〓〓为过程名称 ;number〓〓用于在过程名称重复时进行编号 [(parameter1[,parameter2]...[parameter255])]〓〓为参数序列 WHTH RECOMPILE〓〓执行计划不保存的高速缓存中,每次执行过程需要重新编译 ENCRYPTION〓〓加密syscomments表的内容,syscomments表中包含CREATE PROCere的文本,保证无论何时都不删除syscomments表 FOR REPLICATION〓〓过程在前台执行,不在服务器上执行 下面的SQL语句在MYDATABASE数据库上创建存储过程my_store_pro1 USE MYDATABASE 以下须是一个独立的查询模块,因为CREATE PROCDURE语句须是查询模块的首行。

❻ SQL里中存储过程和触发器,如何创建

(1).存储过程:
create
procere
for_select(你想用的触发器名字)
delare
@name
char(8)
output(用于输出的),@age
int
output(用于输出),@phone_num
char(11)
(输入)
as
select
@name=name(列名),@age=age(列名)
from
table_name(表名)
where
phone_num(列名)=@phone_num
(2)触发器
create
tigger
for_update
on
table_name
after
update
as
if(update(phone_num))
update
table_name2
set
phone_num=i.phone_num
from
deleted
d,inserted
i
where
table_name.phone_num=d.phone_num
end
其中:deleted与inserted是sql中默认的临时表。用来储存原来的值和插入的值。本触发器的作用是
当更新table_name
中的phone_num时table_name1中的phone_num也一起更新!注意触发器只能用于update.insert.delete.select中不能用于创建表............

❼ 如何在触发器中调用存储过程

在触发器中调用存储过程:

CREATEtriggermalice
onBBSUser
forupdate
as
ifupdate(receive)--当receive字段发生update事件时触发
begin
updatebbsuser
setreceive_temp=bu.receive_temp+(i.receive-d.receive)
frombbsuserbu,deletedd,insertedi
wherebu.userid=i.userid

declare@tempfloat,@scopefloat
set@temp=(selectbb.receive_tempfrombbsuserbb,deleteddwherebb.userid=d.userid)
set@scope=(selectbb.receive_scopefromBBSUserbb,deleteddwherebb.userid=d.userid)

if@temp<=@scope
updateuserinfo
setstandnumber=bu.standnumber+(i.receive-d.receive)
fromuserinfobu,deletedd,insertedi
wherebu.userid=d.userid

declare@userint,@comfloat
select@user=d.userid,@com=us.standnumber
fromUserInfous,Deletedd,Insertedi
whereus.userid=d.userid
exectimely@user,@com

if@temp>@scope
begin
updateuserinfo
setstandnumber=bu.standnumber+(@scope-d.receive)
fromuserinfobu,deletedd,insertedi
wherebu.userid=d.userid

updatebbsuser
setreceive_temp=@scope
frombbsuserbu,deletedd
wherebu.userid=d.userid

select@user=d.userid,@com=us.standnumber
fromUserInfous,Deletedd,Insertedi
whereus.userid=d.userid
exectimely@user,@com
end
end

❽ 何为存储过程,举例说明触发器的应用有哪些

存储过程和触发器,基本都是进行复杂数据操作的

区别是:
存储过程:供用户使用的
触发器:DBMS使用的,不提供给用户使用

触发器主要用作数据完整\并列或者保护

如某仓库的某数据
要求管理员在进行操作录入数量的时候
能立即在B表的总库存价值上也根据录入的数量改变,而单个价值又在C表上
那么在A表建立触发器,当管理员在进行操作录入数量的时候
进行和C表的计算,再将结果更新到B表
而以上全部是DBMS自动完成

管理员只需要录入,什么时候进的什么货,进了多少就行了
其他的触发器解决了

❾ 存储过程的触发器

触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如Update、 Insert、 Delete 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
(1) 强化约束(Enforce restriction)
触发器能够实现比CHECK 语句更为复杂的约束。
(2) 跟踪变化Auditing changes
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3) 级联运行(Cascaded operation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4) 存储过程的调用(Stored procere invocation)。
为了响应数据库更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS(数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(Insert、 Update、 Delete)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。 SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(Insert Update Delete) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。
INSTEAD OF触发器表示并不执行其所定义的操作(Insert、 Update、 Delete),而仅是执行触发器本身。既可在表上定义INSTEAD OF触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。 Create procere procere_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释:
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
如:
表book的内容如下
编号 书名 价格
001 C语言入门 $30
002 PowerBuilder报表开发 $52
实例1:查询表Book的内容的存储过程
create proc query_book
as
select * from book
go
exec query_book
实例2:
加入一笔记录到表book,并查询此表中所有书籍的总金额 Createprocinsert_book@param1char(10),@param2varchar(20),@param3money,@---------加密asinsertintobook(编号,书名,价格)Values(@param1,@param2,@param3)select@param4=sum(价格)frombookgo执行例子:declare@total_pricemoneyexecinsert_book顛','Delphi控件开发指南',$100,@total_priceoutputprint'总金额为'+convert(varchar,@total_price)go存储过程的3种传回值:
1)、以Return传回整数
2)、以output格式传回参数
3)、Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
实例3:
设有两个表为Proct,Order_,其表内容如下:
Proct
产品编号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100
Order_
产品编号 客户名 客户订金
001 南山区 $30
002 罗湖区 $50
003 宝安区 $4
请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中
代码如下:
Create proc temp_sale
as
select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
into #temptable from Proct a inner join Order_ b on a.产品编号=b.产品编号-----此处要用别名
if @@error=0
print 'Good'
else
print 'Fail'
go