通过触发器发送邮件
本人发现利用SQLServer中服务器发送邮件的很难找到,本人在此记录下研究之后得出的结果,继承上一篇说的建立SQLServer邮件之后,现在有一个需求就是当有一些网站需要授权的网站,我们授权后给User发送一封邮件,我们利用User 注册时,注册的邮箱然后把消息通知给他(她),下面让我自己上代码吧,我通过自己的测试是成功的,我的数据库(SQLserver2008),系统是win7系统,如果你在测试过程中有问题,可以自己百度查询问题。 </code> GO </code> 触发器开始我是不太懂的,为了方便和我一样不太懂的同志,我把触发器的语法,粘贴在下面: SQL触发器语法参考 参数 是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。 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 表中的所有值,请使用: 如果兼容级别等于 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列,将返回空值;如果这些列不可为空,则返回零长度字符串。 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) 值。 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 是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。 注释 可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER触发器。在表上只能为每个 Insert、Update 和 Delete操作指定一个第一个执行和一个最后一个执行的 AFTER触发器。如果同一表上还有其它 AFTER触发器,则这些触发器将以随机顺序执行。 如果 Alter TRIGGER语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用sp_settriggerorder 重置排序值。 只有当触发 SQL语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER触发器才会执行。AFTER触发器检查触发语句的运行效果,以及所有由触发语句引起的 Update 和Delete 引用级联操作的效果。 触发器限制 触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。 如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。 在同一条 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 说明? 由于 SQL Server不支持系统表中的用户定义触发器,因此建议不要在系统表中创建用户定义触发器。 递归触发器允许发生两种类型的递归: 间接递归 使用直接递归时,应用程序更新表 T1,从而激发触发器TR1,该触发器更新表 T1。由于表 T1 被更新,触发器 TR1再次激发,依此类推。 下例既使用了间接触发器递归,又使用了直接触发器递归。假定在表 T1中定义了两个更新触发器 TR1 和 TR2。触发器 TR1 递归地更新表T1。Update 语句使 TR1 和 TR2 各执行一次。而 TR1 的执行将触发TR1(递归)和 TR2 的执行。给定触发器的 inserted 和 deleted表只包含与唤醒调用触发器的 Update 语句相对应的行。 如果任一触发器执行了 ROLLBACK TRANSACTION语句,则无论嵌套级是多少,都不会进一步执行其它触发器。 嵌套触发器 延迟名称解析 权限 若要检索表或视图中的数据,用户必须在表或视图中拥有 Select语句权限。若要更新表或视图的内容,用户必须在表或视图中拥有Insert、Delete 和 Update 语句权限。 如果视图中存在 INSTEAD OF 触发器,用户必须在该视图中有Insert、Delete 和 Update 特权,以对该视图发出 Insert、Delete 和Update 语句,而不管实际上是否在视图上执行了这样的操作。 ? ? ? ? ? ? ? ? ? ? ? ? ??(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |