数据库基础 之 “存储过程和触发器”

数据库基础 之 “存储过程和触发器”

一想要总结一下存储过程和触发器,就感觉有点怵头,因为总感觉存储过程和触发器是比较高级的东西,总是不能把握。于是就一直拖着没有进行总结不过出来混的迟早也是要还的,也只能硬着头皮总结,这也是自己的点滴积累。我们要做的就是:点滴积累,争取巨大的进步

什么是存储过程呢?

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程的分类

1系统存储过程存储在master中,以sp开头,调用时不必加库名,如果参数是保留字或者数据库对象,用单引号包围.

2用户定义存储过程用户为完成一定的功能定义在数据库中存储过程.

3临时存储过程本地临时:#开头,放在tempdb中,连接断开之后自动删除,本库使用.全局临时:##开头,放在tempdb中,连接断开后使用完之后自动删除,本连接的所有库可以使用.注意命名.

4远程存储过程位于远程服务器上的存储过程.通过分布式查询和execute执行.

5扩展存储过程外部程序写的存储过程,xp开头,动态链接库形式存在,也放在master

那么存储过程有哪些优点呢?

1、速度快。在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。也就是说,存储过程在调用前就已经编译好了,所以存储过程能以极快的速度执行。

2、存储过程可以重复使用,可减少数据库开发人员的工作

3、保证数据的安全性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

4、保证数据的完整性。通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。

虽然触发器有这么多的优点,但也不是用的越多越好,过犹不及。如果在一个程序系统中大量的使用存储过程,那么必然会导致它的数据结构相当复杂,这样维护该系统将会是相当困难的一件事。

1、创建存储过程语句如下:

createprocedure存储过程名

@[参数名] [类型],@[参数名][类型]

as

begin

自定义的功能

end

2、调用存储过程

exec sp_name [参数名]

3、删除存储过程

drop proceduresp_name

自我认为存储过程就是一类特殊的函数,只要我们给它合适的参数就可以直接调用。当然函数和存储过程还有细微的差别,不过暂时研究不深,不必深究。需要注意的一点是不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。

什么是触发器呢?

从定义上来看,触发器其实就是存储过程,只不过它的执行不是由程序调用,也不是手工启动,而是由事件来触发。什么叫由事件来触发呢?其实这和botton按钮的点击事件一样,只不过触发器是由InsertUpdateDelete这些动作触发,而botton的点击事件是通过点击的动作来触发的。

触发器的优点

1. 自动执行。触发器在对表的数据作了任何修改(比如手工输入或者应用程序的操作)之后立即被激活。

2. 级联更新。触发器可以通过数据库中的相关表进行层叠更改,这比直接把代码写在前台的做法更安全合理。

3. 强化约束。触发器可以引用其它表中的列,能够实现比CHECK约束更为复杂的约束。

4. 跟踪变化。触发器可以阻止数据库中未经许可的指定更新和变化。

5. 强制业务逻辑。触发器可用于执行管理任务,并强制影响数据库的复杂业务规则。

创建语句如下:

2.2创建触发器


例子:

create trigger dropStudent

on students

for delete

as

print '成功删除一条数据.'

更新触发器:

create trigger updateStudentName

on students

for update

as

if update (stu_name)

begin

print '不能更新主键,学生号码.'

rollback transaction

end

update students set

stu_name='天启'

where stu_no='09040341029'

查看触发器:

1)使用系统的存储过程查看: exec sp_helptrigger students

使用系统表: select name from sysobjectswhere type='TR'

删除触发器: drop trigger updateStudent

修改触发器:

重命名: sp_renamedropStudent,deleteStudentItem

启动和停止触发器:

alter table students enable triggerall

### PCIeElastic Buffer 的概念与实现 Elastic BufferPCIe 协议中用于解决数据传输时钟域不匹配问题的关键组件。在 PCIe 链路中,发送端和接收端通常运行在不同的时钟域下,这可能导致数据进入缓冲区的速度与离开缓冲区的速度不同。为了应对这种差异,Elastic Buffer 被设计为能够在数据流速不一致的情况下维持数据的完整性。 当数据进入的时钟频率(由 CDR 恢复的时钟频率)小于数据出的时钟频率(本地时钟频率)时,数据会以更快的速度从缓冲区中移除,导致缓冲区中的数据量逐渐减少,甚至可能被掏空[^2]。为了避免这种情况发生,系统会在缓冲区中插入特殊的 SKP 符号,以填充缓冲区并确保其不会被完全清空。 相反地,如果数据进入缓冲区的速度快于离开的速度,则可能会导致缓冲区溢出。对于这种场景,Elastic Buffer 的设计不允许缓冲区读空,但允许一定程度的溢出。在这种情况下,其处理方式类似于 half-full 机制,即通过调整缓冲区的深度来适应时钟差异[^3]。 此外,当 PCIe 设备启用了 SRIS(Split Recovery Idle Sequence),SKP 符号的插入频率会增加,同时需要更大的弹性缓存深度以容纳更多的 SKP 符号。然而,较大的弹性缓存会导致延时增加,从而对性能产生一定的负面影响[^1]。 ### Elastic Buffer 的作用 1. **时钟域同步**:通过插入或移除 SKP 符号,Elastic Buffer 能够在不同时钟域之间实现数据的无缝传输。 2. **避免缓冲区掏空或溢出**:通过动态管理缓冲区中的数据量,Elastic Buffer 确保了链路的稳定性。 3. **支持高性能数据传输**:尽管增加了延时,但 Elastic Buffer 的设计能够有效减少因时钟差异导致的数据丢失或错误。 ```python # 示例代码:模拟 Elastic Buffer 插入 SKP 符号的逻辑 def elastic_buffer_simulation(data_stream, clock_in_rate, clock_out_rate): buffer = [] for data in data_stream: buffer.append(data) if len(buffer) < clock_out_rate / clock_in_rate: buffer.append("SKP") # 插入 SKP 符号以填充缓冲区 while len(buffer) > 0 and len(buffer) >= clock_out_rate / clock_in_rate: yield buffer.pop(0) # 输出数据 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值