`
wlh269
  • 浏览: 455863 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

触发器(二)

F# 
阅读更多
----实例--------------
--要求:当用户向pub_users表添加和删除数据时,将pub_users中的name字段和系统时间(yyyymmdd hh24:mi:ss)
--插入到表pub_logs的name和create_time字段


--创建表
create table pub_users(
   user_Id number(4) primary key,
   name varchar2(8),
   pwd varchar2(20)
);

--添加数据
insert into pub_users values (1,'sss','sss');
insert into pub_users values (2,'ttt','ttt');
  commit;
 
create table pub_logs(
  username varchar2(8),
  create_time varchar2(30)
);



--创建触发器
create or replace trigger crud_user_trigger
after insert or update or delete on pub_users  --触发语句
for each row
begin
  insert into pub_logs values(:old.name,to_char(sysdate,'yyyymmdd hh24:mi:ss'));
end;

--测试
update  pub_users set pwd=123456  where user_id=1;

commit;







--------实例1-----------------
--创建触发器,当用户对test表执行DML语句时,将相关信息记录到日志表test_log

--创建测试表
CREATE TABLE test
(
t_id   NUMBER(4),
t_name VARCHAR2(20),
t_age  NUMBER(2),
t_sex  CHAR
);
--创建记录测试表
CREATE TABLE test_log
(
l_user   VARCHAR2(15),
l_type   VARCHAR2(15),
l_date   VARCHAR2(30)
);
--创建触发器
CREATE OR REPLACE TRIGGER test_trigger
AFTER DELETE OR INSERT OR UPDATE ON test
DECLARE
v_type test_log.l_type%TYPE;
BEGIN
IF INSERTING THEN  --INSERT触发
  v_type := 'INSERT';
  DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志');
ELSIF UPDATING THEN  --UPDATE触发
  v_type := 'UPDATE';
  DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志');
ELSIF DELETING THEN
  v_type := 'DELETE';
  DBMS_OUTPUT.PUT_LINE('记录已经成功删除,并已记录到日志');
END IF;
INSERT INTO test_log VALUES(user,v_type,
        TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss'));
END;
/
--下面我们来分别执行DML语句
INSERT INTO test VALUES(101,'zhao',22,'M');
UPDATE test SET t_age = 30 WHERE t_id = 101;
DELETE test WHERE t_id = 101;
--然后查看效果
SELECT * FROM test;
SELECT * FROM test_log;


--实例2------------------------
  --创建触发器,它将每个部门的总人数和总工资同步更新到一个表dept_sal中(注:每当用户对emp表,进行增删改操作,都重新做统计)
 
  --创建映射表
  CREATE TABLE dept_sal
  AS
  SELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno;
 
  --创建触发器
  create or replace trigger emp_info
  after insert or update or delete on emp
  declare CURSOR cur_emp is  --声明游标
    select deptno,count(empno) as total_emp,sum(sal) as total_sal from emp group by deptno;
begin
   delete dept_sal;--触发时首先删除映射表信息
   for v_emp in cur_emp loop
    --插入数据
    insert into dept_sal   VALUES(v_emp.deptno,v_emp.total_emp,v_emp.total_sal);
   end loop;
  end;
 
  --对emp表进行DML操作
insert  into emp(empno,deptno,sal) VALUES(1111,10,10000);
--DELETE emp WHERE empno=1111;
commit;

--实例3-------
--创建触发器,它记录表的删除数据

--创建表
CREATE TABLE employee(
  id   VARCHAR2(4)  NOT NULL,
  name VARCHAR2(15) NOT NULL,
  age  NUMBER(2)    NOT NULL,
  sex  CHAR         NOT NULL
  );
 
  --插入数据
  INSERT INTO employee VALUES('e101','zhao',23,'M');
  INSERT INTO employee VALUES('e102','jian',21,'F');
  commit;
 
  --创建记录表
  CREATE TABLE old_employeeeeee AS SELECT * FROM employee;

  --创建触发器
  create or replace trigger  tig_old_emp
  after delete on employee
  for each row
  begin
    insert into old_employee values(:old.id,:old.name,:old.age,:old.sex);--:old代表旧值
  end ;
 
 
  --下面进行测试
  DELETE employee;
  SELECT * FROM old_employee;


--实例4------------------------
--创建触发器,利用视图插入数据(注:在试图中插入一条语句,那么相关的2个表中都被插入了数据)

--创建表
CREATE TABLE tab1 (
tid NUMBER(4) PRIMARY KEY,
tname VARCHAR2(20),
tage NUMBER(2)
);

CREATE TABLE tab2 (
tid NUMBER(4),
ttel VARCHAR2(15),
tadr VARCHAR2(30)
);

--插入数据
INSERT INTO tab1 VALUES(101,'zhao',22);
INSERT INTO tab1 VALUES(102,'yang',20);
INSERT INTO tab2 VALUES(101,'13761512841','AnHuiSuZhou');
INSERT INTO tab2 VALUES(102,'13563258514','AnHuiSuZhou');

--创建视图连接两张表
create view tab_view as
select tab1.tid,tname,ttel,tadr from tab1,tab2
where tab1.tid=tab2.tid;

--创建触发器
create or replace trigger tab_trigger
instead of insert on tab_view
  begin
    insert into tab1(tid,tname)values (:new.tid,:new.tname);
    insert into tab2(ttel,tadr)values(:new.ttel,:new.tadr);
  end;
 
  --现在就可以利用视图插入数据
  INSERT INTO tab_view VALUES(105,'zhaoyang','13886681288','beijing');
  commit;
  --查看效果
  SELECT * FROM tab_view;


--创建触发器,比较emp表中更新的工资
CREATE OR REPLACE TRIGGER sal_empBEFORE
before UPDATE ON emp
FOR EACH ROW
BEGIN
  IFld.sal>:new.sal then
   DBMS_OUTPUT.PUT_LINE('工资减少');
   ELSIF :OLD.sal < :NEW.sal THEN
    DBMS_OUTPUT.PUT_LINE('工资增加');
   ELSE  DBMS_OUTPUT.PUT_LINE('工资未作任何变动');
  END IF;
DBMS_OUTPUT.PUT_LINE('更新前工资 :' || :OLD.sal);
DBMS_OUTPUT.PUT_LINE('更新后工资 :' || :NEW.sal);
END;

--执行UPDATE查看效果
UPDATE emp SET sal = 5000 WHERE empno = '7788';
commit;

--创建触发器,将操作CREATE、DROP存储在log_info表

--创建表
CREATE TABLE log_info(
  manager_user VARCHAR2(15),
  manager_date VARCHAR2(15),
  manager_type VARCHAR2(15),
  obj_name     VARCHAR2(15),
  obj_type     VARCHAR2(15)
);

--创建触发器
create or replace trigger trig_log_info
after create or drop on schema
begin
  insert into log_info values(
   user,
   sysdate,
   sys.dictionary_obj_name,
   sys.dictionary_obj_owner,
   sys.dictionary_obj_type
  );
end;

--查看效果
CREATE TABLE a(id NUMBER);
CREATE TYPE aa AS OBJECT(id NUMBER);
DROP TABLE a;
DROP TYPE aa;


--查看效果
SELECT * FROM log_info;






分享到:
评论

相关推荐

    D触发器二分频电路图

    ### D触发器二分频电路图详解 #### 一、D触发器简介 D触发器是一种基本的数字逻辑元件,广泛应用于数字电子系统中。它主要用于数据存储或数据选择等功能。D触发器的特点是它只有一个数据输入端D,以及一个时钟输入...

    Quartus 2 RS、D、JK、T、触发器实验报告 D触发器构成二分频、四分频电路

    - 学习了如何通过触发器之间的组合构建分频电路,如二分频和四分频电路。 通过这样的实验,学生不仅能够理论联系实践,还能够深化对数字逻辑电路的理解,特别是触发器在时序逻辑中的重要作用。这种实践经验对于...

    Quartus 2 RS、D、JK、T、触发器实验报告 D触发器构成二分频、四分频电路

    二分频触发器:时钟每触发2个周期时,电路输出1个周期信号。 比如用一个脉冲时钟触发一个计数器,计数器每计2个数就清零一次并输出1个脉冲,那么这个电路就实现了二分频功能。 四分频触发器: 两个D触发器级联实现四...

    存储过程和触发器的应用

    #### 二、存储过程的创建与应用 ##### 2.1 创建存储过程 创建存储过程需要使用 `CREATE PROCEDURE` 语句。这个过程通常涉及定义存储过程的名称、参数(如果有)、执行的 SQL 语句等。例如: ```sql CREATE ...

    JK触发器--VHDL

    JK触发器是数字电路设计中的基本元件之一,用于存储和传递二进制数据。它具有J和K两个输入端,以及一个时钟信号输入和一个二进制输出。在VHDL(Very High Speed Integrated Circuit Hardware Description Language)...

    Multisim仿真实验三 触发器_触发器_multisimd触发器_serviceq66_T触发器仿真_double34t_源

    第二部分涉及触发器之间的相互转换。在数字逻辑中,常见的触发器类型有RS、D、T、JK等。通过适当的逻辑门连接,这些触发器可以互相转换,实现不同类型的时序逻辑功能。例如,D触发器可以通过非门和与门转换为T触发器...

    Quartus触发器实验报告 D触发器构成二分频、四分频电路

    本文将深入探讨如何利用Quartus软件进行D触发器的设计,并利用这些触发器构建二分频和四分频电路。 首先,我们来理解D触发器的基本概念。D触发器是一种无稳态存储单元,其输入端D(Data)的当前状态会在时钟上升沿...

    数字逻辑实验报告二基本触发器.docx

    实验报告的主题围绕着数字逻辑中的基本触发器,包括RS触发器、D触发器、JK触发器的功能理解和应用。实验旨在让学习者通过实际操作和仿真理解这些触发器的工作原理及特性。 1. **基本RS触发器**:由与非门构建的RS...

    触发器实验报告.doc

    触发器作为基础的存储元件,其核心特性在于它们能维持两种稳定状态,代表二进制的0和1,并在特定条件下能够从一种状态翻转至另一种状态。 1. **基本RS触发器**: RS触发器由两个与非门交叉耦合构成,提供置"0"(S=...

    实验二十五触发器

    **实验二十五:触发器** 在IT领域,尤其是数据库管理中,触发器(Triggers)是一种重要的编程机制。它们是数据库管理系统(DBMS)中的预定义程序,能够在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动...

    RS触发器和SR触发器的区别

    触发器是一种双稳态的存储设备,能够存储一位二进制数(0或1),并且在输入信号变化时改变其输出状态。RS触发器和SR触发器在逻辑功能上非常相似,但它们之间存在重要的区别,尤其是在处理同时激活的置位(Set)和...

    74ls74d触发器构成4位二进制异步加法计数器.ewb

    74ls74d触发器构成4位二进制异步加法计数器.ewb

    RS触发器Proteus仿真

    RS触发器Proteus仿真

    RS、D、JK触发器实验报告.docx

    触发器是数字电子系统中的基础元件,主要负责存储和传输二进制信息。它们在时序逻辑电路中起到关键作用,能够保持数据直到被新的信号覆盖或改变。RS、D、JK触发器是三种常见的类型,各有其特定的逻辑功能和应用场景...

    JK触发器 VHDL QuartusII

    JK触发器是数字电路设计中的基本元件之一,用于存储和传递二进制数据。它是一种双稳态电路,能够根据输入的J(设置)和K(复位)信号改变其输出状态。在VHDL(Very High Speed Integrated Circuit Hardware ...

    rs触发器的逻辑功能

    在逻辑表示中,通常以Q端的逻辑状态代表触发器的状态,因此触发器存储的二进制信息就是Q端的电平。 为了使得RS触发器具有记忆功能,在需要触发翻转时,会利用负脉冲信号。在触发器状态改变后,即使负脉冲消失,...

    D触发器原理-D触发器电路图

    第二步,当 CP 由 0 变 1 时触发器翻转。这时 G3 和 G4 打开,它们的输入 Q3 和 Q4 的状态由 G5 和 G6 的输出状态决定。第三步,在 CP=1 时输入信号被封锁。 边沿 D 触发器的特征方程为 Qn+1=D,状态转移图脉冲特性...

    用T'触发器构成的异步二进制加法计数器实验电路multisim源文件

    用T'触发器构成的异步二进制加法计数器实验电路multisim源文件,multisim10及以上版本可以正常打开仿真,是教材上的电路,可以直接仿真,方便大家学习。

    触发器 主从触发器

    触发器──能够存贮1位二值信号的基本单元电路。 FF的基本特点: ①有两个能自行保持的稳态(1、0); ②可根据不同的输入信号进行置0或置1; ③状态的保持与输入信号无关; 基本FF──也叫基本RS—FF,是...

Global site tag (gtag.js) - Google Analytics