想在項目中插入一個序列,對序列的概念以及用法有點模糊,通過查閱資料現在已經對在oracle中插入序列有了一定的了解:
創建一個序列:
create sequence SEQ_FileInfo_GW
minvalue 100000000
maxvalue 299999999
start with 100000000
increment by 1;
當向表中插入數據時,SQL語句寫法如下:
INSERT
INTO my_table(id,...) values(seq.NEXTVAL,...)
觸發器應用場景:
1、強化約束
2、跟蹤變化
3、級聯運行
4、存儲過程的調用
觸發器分類:
1、DML觸發器
2、INSTEAD OF觸發器
3、系統觸發器
--demo
--創建一個語句級觸發器,不允許用戶在“星期日”使用emp表。
CREATE OR REPLACE
TRIGGER not_sunday
BEFORE INSERT OR
UPDATE OR DELETE ON emp
BEGIN
IF rtrim(to_char(SYSDATE,'day'))='SUNDAY'
THEN
raise_application_error(-20333,'Sorry!Not
on Sundays');
END IF;
END;
--demo
--創建一個行級觸發器,將從emp表中刪除的記錄輸入到ret_emp表中
--step1
CREATE TABLE ret_emp
AS SELECT * FROM emp;
--step1
CREATE OR REPLACE
TRIGGER emp_retire
BEFORE DELETE ON emp
FOR EACH ROW
BEGIN
INSERT INTO ret_emp VALUES
(:OLD.empno,:OLD.ename,:OLD.job,:OLD.mgr,:OLD.hiredate,:OLD.sal,:OLD.comm,:OLD.deptno);
END;
--demo
--創建一個行級觸發器,停止用戶刪除'president'的記錄。
CREATE OR REPLACE
TRIGGER not_president
BEFORE DELETE ON emp
FOR EACH ROW
WHEN
(old.job='PRESIDENT')
BEGIN
raise_application_error(-20444,'CANNOT DELETE
PRESIDENTS RECORD');
END;
--demo
--創建instead of觸發器,通過視圖添加數據。
--step1
create or replace
view v_deptemp
as
select dept.deptno,dept.dname,
emp.empno,emp.ename
from dept,emp
where dept.deptno = emp.deptno;
--step2
insert into
v_deptemp values(90,'dept',9001,'emp');
--step3
create or replace
trigger tr_i_deptemp
instead of insert on
v_deptemp
for each row
declare
v_num number;
begin
select count(*) into v_num
from dept where deptno = :new.deptno;
if v_num = 0 then
insert into dept(deptno,dname)
values(:new.deptno,:new.dname);
end if;
select count(*) into v_num
from emp where empno = :new.empno;
if v_num = 0 then
insert into emp(empno,ename)
values(:new.empno,:new.ename);
end if;
end;
--step4
insert into
v_deptemp values(90,'dept',9001,'emp');
--demo
--創建DDL觸發器
--step1
create table tmp
( tid number,
tdesc varchar2(20)
);
--step2
create or replace
trigger ddlschema
after create or drop
or alter on schema
begin
insert into tmp values(1,'create');
end;
--demo
--創建DDL觸發器
--step1
grant administer
database trigger to scott;
--step2
create or replace
trigger loguser
after logon on
schema
begin
insert into tmp values(1,'user log');
end;
--step3
create or replace
trigger logalluser
after logon on
database
begin
insert into scott.tmp values(2,'user all
log');
end;
--
學海無涯