当前位置: 代码迷 >> PB >> ASA触发器怎的快速获取新增加行的信息
  详细解决方案

ASA触发器怎的快速获取新增加行的信息

热度:26   发布时间:2016-04-29 05:54:30.0
ASA触发器怎样快速获取新增加行的信息
本帖最后由 jiang396 于 2013-05-27 15:27:43 编辑
ms sql里面的对于新增加的行(如logid),可以用一个inserted来获得,请问ASA中怎样获得新增加行(然后找到logid字段)
CREATE TRIGGER trig_users_insert
ON users
FOR INSERT
BEGIN
INSERT INTO UserRight(LogID, ResID)
SELECT Inserted.LogID, Resources.ResID                   //inserted   
FROM Inserted, Resources                                 //inserted系统逻辑表
ORDER BY LogID, ResID
END
GO


mssql中的解释:Inserted 表用于存储INSERT 语句所影响的行的副本。在一个插入或更新事
务处理中,新建行被同时添加到Innserted 表和触发器表中。Inserted 表中的行是触发器表中
新行的副本。------对应asa中是哪个系统逻辑表????
------解决方案--------------------
触发器

目标 
1、定义触发器 
2、解释触发器的使用 
3、讨论使用触发器的优点 
4、列出并说明Adaptive Server Anywhere所支持的四类触发器 
5、Adaptive Server Anywhere所支持的两种触发器激发时机是什么? 
6、触发器的结构 
7、建立触发器 


内容 
1、触发器 
2、触发器的使用 
3、触发器的类型 
4、触发器的实现 

定义触发器
1、它是服务器方的编程,用以制约数据完整性 
2、它由SQL及流程扩展语句构成 
类似于存储过程 
3、是自动执行的 
4、与引发它的事务一起被提交或回滚的 
5、继承着该表建立者的权限 

触发器的用途 
1、利用触发器能实现: 
A>;对DDL而言过分复杂的数据数据完整性规划 
B>;在数据项间存在逻辑关系的业务规划 
C>;自动进行数值修改 
D>;审计 

制约数据完整性 
1、触发器支持 
A>;声明参照完整性 
B>;缺省值 
C>;NOT NULL 约束 
D>;CHECK 条件 
E>;主键 


触发器的优点 
1、独立于客户应用对数据库的访问 
2、标准化 集中于中央位置实现各种规则 
3、高效性 编码是已编译的 
4、安全性 用户和应用无法回避触发器 


触发器的类型 
1、事件驱动的—当发生如下事件时可自动激发触发器 
插入 
删除 
更新 当任何一列被更新都激发 
列更新 仅当特定的列被更新时才激发它 

触发器作用范围和时间 
1、行级触发器 在每行之前或之后 
2、语句级触发器 在整个操作完成之后 
3、可激发同类型的多个触发器 
一下子全部激发 按特定的次序来激发 

建立触发器 
1、由组合语句构成 与存储过程具有同样的能力及特点 触发器不能包括参数和返回结果集 
2、语法 
CREATE TRIGGER trigger-name trigger-time trigger-event
FOR EACH [ROW 
------解决方案--------------------
 STATEMENT]
BEGIN
...;
...;
END

3、建立触发器的用户应具有以下权限 RESOURCE 权 对所需表的ALTER 权限 


插入型触发器 
1、实例 — 禁止增加一个已被解雇的新职员 
CREATE TRIGGER ai_employee AFTER INSERT ON employee REFERENCING NEW AS new_emp FOR EACH ROW 
BEGIN 
 IF new_emp.termination_date IS NOT NULL 
 THEN 
      RAISERROR 30000 'You cannot hire an employee you have already fired';
  END IF;
END

删除型触发器 
1、实例 — 禁止删除一个还未期满的雇员 
CREATE TRIGGER d_employee BEFORE DELETE ON employee REFERENCING OLD AS cur_emp FOR EACH ROW 
BEGIN
IF cur_emp.termination_date IS NULL 
   THEN 
     RAISERROR 30001 'You cannot delete an employee who has not been fired'; 
 END IF; 
END

更新型触发器 
1、实例 — 职员工资升不许降 
CREATE TRIGGER bu_employee BEFORE UPDATE ON employee
REFERENCING NEW AS after_update OLD AS before_update
FOR EACH ROW
  BEGIN    IF after_update.salary < before_update.salary THEN 
       RAISERROR 30002 'You cannot decrease a salary'; 
 END IF; 
 END



列级更新触发器 
1、实例 — 工资只可增加,仅当更新salary列时才激发触发器 
CREATE TRIGGER ub_empsal BEFORE UPDATE OF salary ON employee
REFERENCING NEW AS after_update OLD AS before_update
FOR EACH ROW
   BEGIN 
    IF after_update.salary <  before_update.salary 
    THEN         RAISERROR 30002 'You cannot decrease a salary';       
   END IF;

END


删去一个触发器 
1、语法 
DROP TRIGGER trigger-name 
2、实例 
DROP TRIGGER mytrigger 
3、要求对表有 ALTER 权限 



触发器的执行时机 
1、当数据库出现相应动作时自动被执行 
2、操作次序: 
BEFORE 触发器 
参照动作 
操作 
AFTER 触发器 

对ASE 触发器兼容性的考虑 
1、回滚 
   Adaptive Server Anywhere不支持触发器内的回滚 
   在ASE(或 T-SQL)的触发器中可包含回滚 
   触发器与激发该触发器的操作是原子化的,如果此触发器失败则该操作也自动失败。 
2、嵌套 
   一个触发器所执行的动作导致激发另一个触发器 
  相关解决方案