sqlserver的触发器怎么用?

z1848w 2012-07-13 10:12:52
触发器,具体的应用实例,希望大神、专家指导。谢谢
...全文
535 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
上官逸云 2013-08-28
  • 打赏
  • 举报
回复
好的,不错!sudu2013点com 请看看。。。。
baby01517 2012-07-24
  • 打赏
  • 举报
回复
这是本人学习触发器知识时,整理的知识点,希望对你有帮助:
触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。
触发器可通过数据库中的相关表实现级联更改,触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。
触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
AFTER 触发器:指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器,不能在视图上定义 AFTER 触发器。
Instead of 触发器:指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。
当在 sp_dboption 中启用 recursive triggers 设置时,SQL Server 还允许触发器的递归调用。
禁用 recursive triggers 设置只能禁止直接递归。若要也禁用间接递归,请使用 sp_configure 将 nested triggers 服务器选项设置为 0。

示例 :
A. 使用带有提醒消息的触发器,当有人试图在 titles 表中添加或更改数据时,下例将向客户端显示一条消息。 
B. 使用带有提醒电子邮件的触发器
C. 使用 COLUMNS_UPDATED,下例创建两个表:一个 employeeData 表和一个 auditEmployeeData 表。人力资源部的成员可以修改 employeeData 表,该表包含敏感的雇员薪水信息。如果更改了雇员的社会保险号码 (SSN)、年薪或银行帐户,则生成审核记录并插入到 auditEmployeeData 审核表。 通过使用 COLUMNS_UPDATED() 功能,可以快速测试对这些包含敏感雇员信息的列所做的更改。只有在试图检测对表中的前 8 列所做的更改时,COLUMNS_UPDATED() 才起作用。

链接:http://baike.baidu.com/view/1189954.htm
触发器功能:
1、 检查所做的SQL是否允许:例如,在“产品库存”表里,如要删除一条产品记录,在删除记录时,触发器可以检查该产品库存量是否为零,如果为0,则取消该删除操作。
2、 修改其他数据表里的数据
3、 调用更多的存储过程
4、 发送SQL mail
5、 防止数据表结构更改或数据表被删除:
After触发器的工作原理(是在Insert,update和delete操作完成后才激活的):
在记录变更之后才被激活,若要删除记录,当sql server接到一个要执行删除操作的SQL语句时,Sql server 先将要删除的记录存放在删除表里,然后把数据表里的记录删除,再激活After触发器,执行after触发器里的SQL语句,执行完毕后,删除内存中的删除表,退出整个操作。
Instead of触发器:不执行原来的SQL操作,而去运行触发器本身的SQL语句。
筱筱澄 2012-07-18
  • 打赏
  • 举报
回复
利用触发器实现标识列连续。(支持批量插入) 
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ttt]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ttt]
GO

/****** Object: Table [dbo].[ttt] Script Date: 2008-12-15 17:11:26 ******/
CREATE TABLE [dbo].[ttt] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[time] [datetime] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ttt] ADD
CONSTRAINT [PK_ttt] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO

insert into ttt(name,time) values('logan',getdate());
insert into ttt(name,time) values('peter',getdate());
insert into ttt(name,time) values('man',getdate());
insert into ttt(name,time) values('lida',getdate());
insert into ttt(name,time) values('fcuandy',getdate());

select * from ttt
/*
1 logan 2008-12-15 17:36:37.780
2 peter 2008-12-15 17:36:37.780
3 man 2008-12-15 17:36:37.780
4 lida 2008-12-15 17:36:37.780
5 fcuandy 2008-12-15 17:36:37.793
*/


GO
CREATE TRIGGER tr ON ttt
INSTEAD OF INSERT
AS
SET IDENTITY_INSERT ttt ON
DECLARE @n INT
SELECT @n=MAX(id) FROM ttt
;WITH fc AS
(
SELECT n=1
UNION ALL
SELECT nn=n+1 FROM fc WHERE n<@n
),fc1 AS
(
SELECT n FROM fc a
LEFT JOIN ttt b
ON a.n = b.id
WHERE b.id IS NULL
)
INSERT ttt(id,name,time) SELECT n,name,time
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY GETDATE()) idx,n FROM fc1) a
INNER JOIN
(
SELECT idx=ROW_NUMBER() OVER (ORDER BY GETDATE()),name,time FROM inserted
) b
ON a.idx=b.idx
DECLARE @r INT
SELECT @r=@@ROWCOUNT

SET IDENTITY_INSERT ttt OFF
INSERT ttt(name,time) SELECT name,time FROM
(
SELECT idx=ROW_NUMBER() OVER (ORDER BY GETDATE()),name,time FROM inserted
) x
WHERE idx>@r


GO
DELETE FROM ttt WHERE name = 'peter' OR name='lida'
GO
INSERT ttt SELECT 'xxx',getdate()
INSERT ttt SELECT 'yyy',GETDATE()
GO
SELECT * FROM ttt
/*
1 logan 2008-12-15 17:37:20.967
2 xxx 2008-12-15 17:37:21.013
3 man 2008-12-15 17:37:20.967
4 yyy 2008-12-15 17:37:21.030
5 fcuandy 2008-12-15 17:37:20.967
*/

DELETE FROM ttt WHERE name ='xxx' OR name='yyy'

INSERT ttt SELECT 'roy_88',GETDATE() UNION ALL SELECT 'limpire',GETDATE() UNION ALL SELECT '熊',GETDATE()

SELECT * FROM ttt

/*
1 logan 2008-12-15 17:38:29.450
2 roy_88 2008-12-15 17:38:29.530
3 man 2008-12-15 17:38:29.467
4 limpire 2008-12-15 17:38:29.530
5 fcuandy 2008-12-15 17:38:29.467
6 熊 2008-12-15 17:38:29.530
*/


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fcuandy/archive/2008/12/15/3522876.aspx
Anod 2012-07-18
  • 打赏
  • 举报
回复
度娘 “sql_server_2008_c存储过程与触发器” 自己看吧。。
z1848w 2012-07-17
  • 打赏
  • 举报
回复
谢谢了
z1848w 2012-07-17
  • 打赏
  • 举报
回复
谢谢了
人生无悔 2012-07-13
  • 打赏
  • 举报
回复
自动调用的,不需要你去使用,根据你的业务逻辑去建立就可以了
http://msdn.microsoft.com/zh-cn/library/ms189799.aspx
慢慢研究下,有看不懂的再问
shoppo0505 2012-07-13
  • 打赏
  • 举报
回复
就是当表格数据更改的时候,比如insert, update, delete,然后立即执行触发器中的行为.不管触发器的行为是否执行成功,表格的操作都是已经执行完成,并保存.

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧