快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡新京返水在哪里_龟发之家论坛



触发器

触发器的根基常识

create trigger tr_name

on table/view{for | after | instead of } [update][,][insert][,][delete]

[with encryption]as {batch | if update (col_name) [{and|or} update (col_name)] }

阐明:

1 tr_name :触发器名称

2 on table/view :触发器所感化的表。一个触发器只能感化于一个表

3 for 和after :同义

4 after 与instead of :sql 2000新增项目afrer 与 instead of 的差别

After

在触发事故发生今后才被激活,只可以建立在表上

Instead of

代替了响应的触发事故而被履行,既可以建立在表上也可以建立在视图上

5 insert、update、delete:激活触发器的三种操作,可以同时履行,也可选其一

6 if update (col_name):注解所作的操作对指定列是否有影响,有影响,则激活触发器。此外,由于delete 操作只对行有影响,

以是假如应用delete操作就不能用这条语句了(虽然应用也不掉足,然则不能激活触发器,没意义)。

7 触发器履行时用到的两个特殊表:deleted ,inserted

deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动天生的,其布局与触发器感化的表布局是一样的,只是寄放 的数据有差异。

8 阐明deleted 与inserted 数据的差异

deleted 与inserted 数据的差异

Inserted 寄放进行insert和update 操作后的数据

Deleted 寄放进行delete 和update操作前的数据

留意:update 操作相称于先辈行delete 再进行insert ,以是在进行update操作时,改动前的数据拷贝一条到deleted 表中,改动后的数据在存到触发器感化的表的同时,也同时天生一条拷贝到insered表中

触发器范例示例

if exists(select name from sysobjects where xtype='tr' and name='tri_updateStudent')

begindrop trigger tri_UpdateStudent

end go

create trigger tri_UpdateStudenton dbo.student

for update as

if update(Sage)begin

update student set sage=s.sage+d.sage from student s,deleted d where s.studentid=d.studentidend

go

存储历程

存储历程的优点

A、 存储历程容许标准组件式编程

B、 存储历程能够实现较快的履行速率

C、 存储历程减轻收集流量

D、 存储历程可被作为一种安然机制来充分使用

存储历程的实例

if exists(select * from sysobjects where xtype='p' and name='proc_Student')

begin

drop proc proc_student

end

go

create proc proc_Student

@name varchar(255),

@age varchar(255)

as

begin tran

select * from student wheresname=@name and sage=@age

if @@ERROR

begin

rollback tran

insert into student(studentid,sname,sage) values (1,@name,@age)

return 0

end

else

begin

commit tran

select * from student

end

go

exec proc_student '程兴亮',1;

表变量

表变量定义:

表变量创建的语法类似于临时表,差别就在于创建的时刻,必须要为之命名。表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都因此“@”为前缀,只有在本地当前的用户连接中才可以造访。全局的表变量的名称都因此“@@”为前缀,一样平常都是系统的全局变量,像我们常用到的,如@@Error代表差错的号,@@RowCount代表影响的行数。

DECLARE @News table

(

News_id int NOT NULL,

NewsTitle varchar(100),

NewsContent varchar(2000),

NewsDateTime datetime

)

INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime)

VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())

SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News

临时表

临时表定义:

临时表与永远表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接停止后或者由SQL敕令DROP掉落,才会消掉,否则就会不停存在。临时表在创建的时刻都邑孕育发生SQL Server的系统日志,虽它们在Tempdb中表现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。

临时表分为本地和全局两种,本地临时表的名称都因此“#”为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除。全局临时表的名称都因此“##”为前缀,创建后对澳门新葡新京返水在哪里任何用户都是可见的,当所有引用该表的用户断开连接时被删除

CREATE TAB澳门新葡新京返水在哪里LE dbo.#News

(  News_id int NOT NULL,

NewsTit澳门新葡新京返水在哪里le varchar(100),  NewsContent varchar(2000),

NewsDateTime datetime  )

INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime)  VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())

SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News  DROP TA澳门新葡新京返水在哪里BLE dbo.[#News]

表变量和临时表比较总结

特点

表变量

临时表

感化域

当前批处置惩罚

当前会话,嵌套存储历程,全局:所有会话

应用处景

自定义函数,存储历程,批处置惩罚

自定义函数,存储历程,批处置惩罚

创建要领

DECLARE statement only.只能经由过程DECLEARE语句创建

CREATE TABLE 语句

SELECT INTO 语句.

表名长度

最多128字节

最多116字节

列类型

可以应用自定义数据类型

可以应用XML聚拢

自定义数据类型和XML聚拢必须在TempDb内定义

Collation

字符串排序规则承袭自当前数据库

字符串排序规则承袭自TempDb数据库

索引

索引必须在表定义时建立

索引可以在表创建后建立

约束

PRIMARY KEY, UNIQUE, NULL, CHECK约束可以应用,但必须在表树马上声明

PRIMARY KEY, UNIQUE, NULL, CHECK. 约束可以应用,可以在任何时后添加,但不能有外键约束

表建立后应用DDL (索引,列)

不容许

容许.

数据插入要领

INSERT 语句 (SQL 2000: 不能应用INSERT/EXEC).

INSERT 语句, 包括 INSERT/EXEC.

SELECT INTO 语句.

Insert explicit values into identitycolumns (SET IDENTITY_INSERT).

不支持SET IDENTITY_INSERT语句

支持SET IDENTITY_INSERT语句

Truncate table

不容许

容许

析构要领

批处置惩罚停止后自动析构

显式调用 DROP TABLE 语句.

当前会话停止自动析构 (全局临时表: 还包括当其它会话语句不在引用表.)

事务

只会在更新表的时刻有事务,持续光阴比临时表短

正常的事务长度,比表变量长

存储历程重编译

会澳门新葡新京返水在哪里导致重编译

回滚

不会被回滚影响

会被回滚影响

统计数据

不创建统计数据,以是所有的预计行数都为1,以是天生履行计划会不精准

创建统计数据,经由过程实际的行数天生履行计划。

作为参数传入存储历程

仅仅在SQL Server2008, 并且必须预定义user-defined table type.

不容许

显式命名工具 (索引, 约束).

不容许

容许,然则要留意多用户的问题

动态SQL

必须在动态SQL中定义表变量

可以在调用动态SQL之前定义临时表

用法:无表关联操作,只作为中心集进行数据处置惩罚,建议用表变量;有表关联,且不能确定命据量大年夜小的环境下,建议用临时表。

您可能还会对下面的文章感兴趣: