通过触发器发送邮件

本人发现利用SQLServer中服务器发送邮件的很难找到,本人在此记录下研究之后得出的结果,继承上一篇说的建立SQLServer邮件之后,现在有一个需求就是当有一些网站需要授权的网站,我们授权后给User发送一封邮件,我们利用User 注册时,注册的邮箱然后把消息通知给他(她),下面让我自己上代码吧,我通过自己的测试是成功的,我的数据库(SQLserver2008),系统是win7系统,如果你在测试过程中有问题,可以自己百度查询问题。

</code>

GO
create trigger [dbo].[T_mail]
on [dbo].[UserName]
for update
as
declare @name varchar(50)
declare @email varchar(100)
declare @number varchar(2)
select @name=Name from UserName where ID=(select MAX(ID) from UserName)
select @email=Email from UserName where Name=@name
select @number=Flag from UserName where Name=@name


if(@number='1')
begin


exec msdb..sp_send_dbmail @profile_name =  'dba_profile2'               -- profile 名称


                         ,@recipients   =  @email          -- 收件人邮箱


                         ,@subject      =  '注册成功!' -- 邮件标题


                         ,@body         =  '您好,恭喜您注册成功,请勿回复,谢谢!'               -- 邮件内容


                         ,@body_format  =  'TEXT'
                         end

</code>

触发器开始我是不太懂的,为了方便和我一样不太懂的同志,我把触发器的语法,粘贴在下面:

SQL触发器语法参考
CreateTRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
    { { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }
      [ WITH APPEND ]
      [ NOT FOR REPLICATION ]
      AS
      [ { IF Update ( column )
          [ { AND | or } Update ( column ) ]
              [ ...n ]
      | IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask)
              { comparison_operator } column_bitmask [ ...n ]
      } ]
      sql_statement [ ...n ]
    }
}

参数
trigger_name

是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。

Table | view

是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。

WITH ENCRYPTION

加密 syscomments 表中包含 Create TRIGGER语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server复制的一部分发布。

AFTER

指定触发器只有在触发 SQL语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定 FOR 关键字,则 AFTER是默认设置。

不能在视图上定义 AFTER 触发器。

INSTEAD OF

指定执行触发器而不是执行触发 SQL语句,从而替代触发语句的操作。

在表或视图上,每个 Insert、Update 或 Delete语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有INSTEAD OF 触发器的视图上定义视图。

INSTEAD OF 触发器不能在 WITH CHECK OPTION的可更新视图上定义。如果向指定了 WITH CHECK OPTION选项的可更新视图添加 INSTEAD OF 触发器,SQL Server将产生一个错误。用户必须用 Alter VIEW 删除该选项后才能定义 INSTEADOF 触发器。

{ [Delete] [,] [Insert] [,][Update] }

是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。

对于 INSTEAD OF 触发器,不允许在具有 ON Delete级联操作引用关系的表上使用 Delete 选项。同样,也不允许在具有 ONUpdate 级联操作引用关系的表上使用 Update 选项。

WITH APPEND

指定应该添加现有类型的其它触发器。只有当兼容级别是 65或更低时,才需要使用该可选子句。如果兼容级别是 70或更高,则不必使用 WITH APPEND子句添加现有类型的其它触发器(这是兼容级别设置为 70 或更高的 CreateTRIGGER 的默认行为)。有关更多信息,请参见sp_dbcmptlevel。

WITH APPEND 不能与 INSTEAD OF触发器一起使用,或者,如果显式声明 AFTER触发器,也不能使用该子句。只有当出于向后兼容而指定 FOR 时(没有INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以后的版本将不支持WITH APPEND 和 FOR(将被解释为 AFTER)。

NOT FOR REPLICATION

表示当复制进程更改触发器所涉及的表时,不应执行该触发器。

AS

是触发器要执行的操作。

sql_statement

是触发器的条件和操作。触发器条件指定其它准则,以确定Delete、Insert 或 Update 语句是否导致执行触发器操作。

当尝试 Delete、Insert 或 Update操作时,Transact-SQL语句中指定的触发器操作将生效。

触发器可以包含任意数量和种类的 Transact-SQL语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的Transact-SQL 语句常常包含控制流语言。Create TRIGGER语句中使用几个特殊的表:

deleted 和 inserted是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索deleted 表中的所有值,请使用:
Select *
FROM deleted

如果兼容级别等于 70,那么在 Delete、Insert 或Update 触发器中,SQL Server 将不允许引用 inserted 和 deleted 表中的text、ntext 或 image 列。不能访问 inserted 和 deleted 表中的text、ntext 和 image 值。若要在 Insert 或 Update触发器中检索新值,请将 inserted 表与原始更新表联接。当兼容级别是 65或更低时,对 inserted 或 deleted 表中允许空值的text、ntext 或 image列,将返回空值;如果这些列不可为空,则返回零长度字符串。
当兼容级别是 80 或更高时,SQL Server 允许在表或视图上通过 INSTEADOF 触发器更新 text、ntext 或 image 列。

n

是表示触发器中可以包含多条 Transact-SQL语句的占位符。对于 IF Update (column) 语句,可以通过重复 Update(column) 子句包含多列。

IF Update (column)

测试在指定的列上进行的 Insert 或 Update操作,不能用于 Delete 操作。可以指定多列。因为在 ON子句中指定了表名,所以在 IF Update子句中的列名前不要包含表名。若要测试在多个列上进行的 Insert 或Update 操作,请在第一个操作后指定单独的 Update(column) 子句。在Insert 操作中 IF Update 将返回 TRUE值,因为这些列插入了显式值或隐性 (NULL) 值。


说明  IF Update (column) 子句的功能等同于IF、IF...ELSE 或 WHILE 语句,并且可以使用 BEGIN...END语句块。有关更多信息,请参见控制流语言。


可以在触发器主体中的任意位置使用 Update (column)。

column

是要测试 Insert 或 Update 操作的列名。该列可以是 SQL Server支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。

IF (COLUMNS_UpdateD())

测试是否插入或更新了提及的列,仅用于 Insert 或 Update触发器中。COLUMNS_UpdateD 返回 varbinary位模式,表示插入或更新了表中的哪些列。

COLUMNS_UpdateD函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含8 列以上,则 COLUMNS_UpdateD返回多个字节,最左边的为最不重要的字节。在 Insert 操作中COLUMNS_UpdateD 将对所有列返回 TRUE值,因为这些列插入了显式值或隐性 (NULL) 值。

可以在触发器主体中的任意位置使用 COLUMNS_UpdateD。

bitwise_operator

是用于比较运算的位运算符。

updated_bitmask

是整型位掩码,表示实际更新或插入的列。例如,表 t1 包含列C1、C2、C3、C4 和 C5。假定表 t1 上有 Update 触发器,若要检查列C2、C3 和 C4 是否都有更新,指定值 14;若要检查是否只有列 C2有更新,指定值 2。

comparison_operator

是比较运算符。使用等号 (=) 检查 updated_bitmask中指定的所有列是否都实际进行了更新。使用大于号 (>) 检查updated_bitmask 中指定的任一列或某些列是否已更新。

column_bitmask

是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。

注释
触发器常常用于强制业务规则和数据完整性。SQL Server通过表创建语句(Alter TABLE 和 Create TABLE)提供声明引用完整性(DRI);但是 DRI不提供数据库间的引用完整性。若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(AlterTABLE 和 Create TABLE 的 PRIMARY KEY 和 FOREIGN KEY关键字)。如果触发器表存在约束,则在 INSTEAD OF 触发器执行之后和AFTER 触发器执行之前检查这些约束。如果违反了约束,则回滚 INSTEAD OF触发器操作且不执行(激发)AFTER 触发器。

可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER触发器。在表上只能为每个 Insert、Update 和 Delete操作指定一个第一个执行和一个最后一个执行的 AFTER触发器。如果同一表上还有其它 AFTER触发器,则这些触发器将以随机顺序执行。

如果 Alter TRIGGER语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用sp_settriggerorder 重置排序值。

只有当触发 SQL语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER触发器才会执行。AFTER触发器检查触发语句的运行效果,以及所有由触发语句引起的 Update 和Delete 引用级联操作的效果。

触发器限制
Create TRIGGER必须是批处理中的第一条语句,并且只能应用到一个表中。

触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。

如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。

在同一条 Create TRIGGER 语句中,可以为多种用户操作(如 Insert 和Update)定义相同的触发器操作。

如果一个表的外键在 Delete/Update操作上定义了级联,则不能在该表上定义 INSTEAD OF Delete/Update触发器。

在触发器内可以指定任意的 SET 语句。所选择的 SET选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。

与使用存储过程一样,当触发器激发时,将向调用应用程序返回结果。若要避免由于触发器激发而向应用程序返回结果,请不要包含返回结果的Select语句,也不要包含在触发器中进行变量赋值的语句。包含向用户返回结果的Select语句或进行变量赋值的语句的触发器需要特殊处理;这些返回的结果必须写入允许修改触发器表的每个应用程序中。如果必须在触发器中进行变量赋值,则应该在触发器的开头使用SET NOCOUNT 语句以避免返回任何结果集。

Delete 触发器不能捕获 TRUNCATE TABLE 语句。尽管 TRUNCATE TABLE语句实际上是没有 Where 子句的Delete(它删除所有行),但它是无日志记录的,因而不能执行触发器。因为TRUNCATE TABLE语句的权限默认授予表所有者且不可转让,所以只有表所有者才需要考虑无意中用TRUNCATE TABLE 语句规避 Delete 触发器的问题。

无论有日志记录还是无日志记录,WRITETEXT 语句都不激活触发器。

触发器中不允许以下 Transact-SQL 语句:

Alter DATABASE Create DATABASE DISK INIT
DISK RESIZE Drop DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE RESTORE DATABASE
RESTORELOG   

说明  由于 SQL Server不支持系统表中的用户定义触发器,因此建议不要在系统表中创建用户定义触发器。


多个触发器
SQL Server 允许为每个数据修改事件(Delete、Insert 或Update)创建多个触发器。例如,如果对已有 Update 触发器的表执行Create TRIGGER FORUpdate,则将创建另一个更新触发器。在早期版本中,在每个表上,每个数据修改事件(Insert、Update或 Delete)只允许有一个触发器。


说明  如果触发器名称不同,则 CreateTRIGGER(兼容级别为70)的默认行为是在现有的触发器中添加其它触发器。如果触发器名称相同,则SQL Server 返回一条错误信息。但是,如果兼容级别等于或小于65,则使用 Create TRIGGER语句创建的新触发器将替换同一类型的任何现有触发器,即使触发器名称不同。有关更多信息,请参见sp_dbcmptlevel。


递归触发器
当在 sp_dboption 中启用 recursivetriggers 设置时,SQL Server 还允许触发器的递归调用。

递归触发器允许发生两种类型的递归:

间接递归


直接递归
使用间接递归时,应用程序更新表 T1,从而激发触发器TR1,该触发器更新表 T2。在这种情况下,触发器 T2 将激发并更新T1。

使用直接递归时,应用程序更新表 T1,从而激发触发器TR1,该触发器更新表 T1。由于表 T1 被更新,触发器 TR1再次激发,依此类推。

下例既使用了间接触发器递归,又使用了直接触发器递归。假定在表 T1中定义了两个更新触发器 TR1 和 TR2。触发器 TR1 递归地更新表T1。Update 语句使 TR1 和 TR2 各执行一次。而 TR1 的执行将触发TR1(递归)和 TR2 的执行。给定触发器的 inserted 和 deleted表只包含与唤醒调用触发器的 Update 语句相对应的行。


说明  只有启用 sp_dboption 的 recursive triggers设置,才会发生上述行为。对于为给定事件定义的多个触发器,并没有确定的执行顺序。每个触发器都应是自包含的。


禁用 recursive triggers设置只能禁止直接递归。若要也禁用间接递归,请使用 sp_configure 将nested triggers 服务器选项设置为 0。

如果任一触发器执行了 ROLLBACK TRANSACTION语句,则无论嵌套级是多少,都不会进一步执行其它触发器。

嵌套触发器
触发器最多可以嵌套 32层。如果一个触发器更改了包含另一个触发器的表,则第二个触发器将激活,然后该触发器可以再调用第三个触发器,依此类推。如果链中任意一个触发器引发了无限循环,则会超出嵌套级限制,从而导致取消触发器。若要禁用嵌套触发器,请用sp_configure 将 nested triggers 选项设置为0(关闭)。默认配置允许嵌套触发器。如果嵌套触发器是关闭的,则也将禁用递归触发器,与sp_dboption 的 recursive triggers 设置无关。

延迟名称解析
SQL Server 允许 Transact-SQL存储过程、触发器和批处理引用编译时不存在的表。这种能力称为延迟名称解析。但是,如果Transact-SQL存储过程、触发器或批处理引用在存储过程或触发器中定义的表,则只有当兼容级别设置(通过执行sp_dbcmptlevel 设置)等于 65时,才会在创建时发出警告。如果使用批处理,则在编译时发出警告。如果引用的表不存在,将在运行时返回错误信息。有关更多信息,请参见延迟名称解析和编译。

权限
Create TRIGGER 权限默认授予定义触发器的表所有者、sysadmin固定服务器角色成员以及 db_owner 和 db_ddladmin固定数据库角色成员,并且不可转让。

若要检索表或视图中的数据,用户必须在表或视图中拥有 Select语句权限。若要更新表或视图的内容,用户必须在表或视图中拥有Insert、Delete 和 Update 语句权限。

如果视图中存在 INSTEAD OF 触发器,用户必须在该视图中有Insert、Delete 和 Update 特权,以对该视图发出 Insert、Delete 和Update 语句,而不管实际上是否在视图上执行了这样的操作。


                          
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值