设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3133|回复: 6
打印 上一主题 下一主题

視圖上建立觸發器[讨论]

[复制链接]
跳转到指定楼层
1#
发表于 2002-6-20 19:14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
請問一下,在視圖上建立觸發器和在于起想對應的基表上建立觸發器有何不同?
比如說:一個基表發生了插入操作了,哪么他會的視圖會發生改變(但如果我們沒有
調用哪個視圖,哪么視會上的觸發器會觸發嗎?)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2002-6-20 19:26:00 | 只看该作者
请问视图也有触发器吗?怎么建立?我还真的不知道。[em09]

[em04][em13][em22][em28]
3#
 楼主| 发表于 2002-6-20 19:47:00 | 只看该作者
老朱您又開玩笑了。
這樣建立
create trigger utr_uview_insert on uview/utable after insert/update/delete as sqlstatement
---------------------------------
這是SQL2000引用的新特性.
建產很容易,但不是上述問題為不會發生.

点击这里给我发消息

4#
发表于 2002-6-20 19:56:00 | 只看该作者
对不起,是我孤陋寡闻。

CREATE TRIGGER
创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。Microsoft® SQL Server™ 允许为任何给定的 INSERT、UPDATE 或 DELETE 语句创建多个触发器。

语法
CREATE TRIGGER 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 删除该选项后才能定义 INSTEAD OF 触发器。

{ [DELETE] [,] [INSERT] [,] [UPDATE] }

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

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

WITH APPEND

指定应该添加现有类型的其它触发器。只有当兼容级别是 65 或更低时,才需要使用该可选子句。如果兼容级别是 70 或更高,则不必使用 WITH APPEND 子句添加现有类型的其它触发器(这是兼容级别设置为 70 或更高的 CREATE TRIGGER 的默认行为)。有关更多信息,请参见 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 允许在表或视图上通过 INSTEAD OF 触发器更新 text、ntext 或 image 列。

n

是表示触发器中可以包含多条 Transact-SQL
5#
 楼主| 发表于 2002-6-20 21:41:00 | 只看该作者
**^_^**
6#
 楼主| 发表于 2002-6-21 22:48:00 | 只看该作者
老朱同志看看我寫的觸發器。在一個觸發器中完成了余貨回倉的功能。
CREATE trigger utr_wh_more_update on trade_wh_more after update as   
if (columns_updated()&2) >0   
     --如果表trade_wh_more的第二列發生更新則執行以下程式   
   begin   
    declare @wh_ins_line_no as int,@request_line_pt_sum as decimal(8,2),@wh_more_pt_sum as decimal(8,2),@wh_ins_line_pt_bak as decimal(8,2),@wh_ins_line_pt_new as decimal(8,2)   
           
    select @wh_ins_line_no = (select wh_ins_line_no from trade_request_line inner join inserted on trade_request_line.request_line_no = inserted.request_line_no)   
    select @request_line_pt_sum =(select request_line_pt_sum from uv_qry_sum_request_line_pt where wh_ins_line_no = @wh_ins_line_no)   
    select @wh_more_pt_sum = (select wh_more_pt_sum from uv_qry_sum_wh_more_pt  where wh_ins_line_no = @wh_ins_line_no)   
    select @wh_ins_line_pt_bak = (select wh_ins_line_pt from trade_wh_ins_line_pt where wh_ins_line_no = @wh_ins_line_no)   
    select @wh_ins_line_pt_new = (@wh_ins_line_pt_bak - @request_line_pt_sum + @wh_more_pt_sum)   
   
    update trade_wh_ins_line set wh_ins_line_pt = @wh_ins_line_pt_new  where wh_ins_line_no = @wh_ins_line_no   
   
  end   
   
---------------------------------------------------------------------------------

7#
 楼主| 发表于 2002-6-21 23:03:00 | 只看该作者
在SQL中對T_SQL語言之我之見。
首先談一下為什么要學T_SQL語言。
T_SQL語言是SQL92標准在MSSQL數據為上的擴展,
全名為Transact-sql,中文名是事務性結構化查詢語言
顧名思義就知道,它在MSSQL中的地位了。為什么我會去學習他哪?
首先它也是一門語言,對于哪些想成長為MSDBA的人員來說必不可少的。
現此他是MSSQL內建的,MSSQL在市場上的份額決定我去學習它。
因為他是內鍵的,哪么好各多,如果掌握了T_SQL語言,哪么不論您用什么軟件只要可以向MSSQL進行四種操作(select,insert,delete,update)哪么您就可以開始c/s構架的應用了。
我的一個想法是用MSSQL的強大功能,來結合其它的操作系統,構建新型的c/s應用,
比如用mssql來作后台,用php+apach+linux來作服務器等。想法不好嗎?
只要你可以進行四種基本操作,哪么T-sql可以搞定一切。
-----------------------個人見解----------------------------------
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-6-14 23:27 , Processed in 0.224120 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表