150801課堂筆記 觸發器(未完)

2021-07-04 06:31:50 字數 3431 閱讀 8943

--2015.08.01 memo

--觸發器

--建立產品表

create table products

(id number(11) primary key,

name varchar2(30) not null,

price number(6,2)

)--建立倉庫表

create table store

(id number(11) primary key,

product_id number(11) not null,

count number(11,2) not null

)--建立序列

create sequence seq_products_id

start with 1

increment by 1;

create sequence seq_store_id

start with 1

increment by 1;

--在products表中插入資料後在store表同步插入

create or replace trigger tr_store_products

after insert 

on products

for each row  --指定是否對受影響的每行都執行觸發器,即行級觸發器,如果不使用此子句,則為語句級觸發器

begin

insert into store values(seq_store_id.nextval,:new.id,0);

end;

insert into products values(seq_products_id.nextval,'洗衣機',5000);

--語句級觸發器

--禁止員工在休息日改變雇員資訊

select to_char(sysdate,'yyyy-mm-dd day hh:mi:ss','nls_date-language=american') from dual;

--找出星期幾

select to_char(sysdate,'day','nls_date_language-american') from dual; --to_char:轉換字串,將sysdate轉換成day,並使用英文格式

create or replace trigger tr_forbide_employees

before update or delete or insert 

on employees

declare         --觸發器的變數宣告

day1 varchar2(10);

day_weekend exception;

begin

select to_char(sysdate,'day','nls_date_language-american')into day1 from dual;

if trim(day1) in('saturday','sunday') then --使用trim:day1實際上為'saturday '需去掉最後的空格

raise day_weekend;

end if;

--exception when day_weekend then

--dbms_output.put_line('休息日不允許修改員工資訊');  //對異常進行處理後後續語句得以繼續執行,無法實現禁止修改功能

end;

--將某個觸發器停止

alter trigger tr_forbide_employees disable; 

--練習:限制員工工資不能超過當前的最高工資

--update of後面指定在那些列被改變時才呼叫這個觸發器,不加of預設是所有列

create or replace function fun_find_max_salary

return number

is max_sal number(8,2);

begin

select max(salary) into max_sal from employees;

return max_sal;

end;

create or replace trigger max_over_forbide

before update of salary 

on employees

for each row 

declare

maxsalary number(10,2);

over_max_salary exception;

pragma autonomous_transaction;  --???

begin 

maxsalary:=fun_find_max_salary;  --此處不能直接使用select max(salary) into maxsalary from employees;

if (:new.salary > maxsalary) then

raise over_max_salary;

end if;

end;

--資料庫級:當使用者登陸時,出現歡迎

create or replace trigger tr_logon_on

after logon on database

begin

dbms_output.put_line('歡迎登入資料庫!');

end;

--能成功建立該觸發器,但登入時不顯示『歡迎登入資料庫』  why?

create or replace trigger tr_logon_on

after logon on database

begin

end;

--登入其他使用者時顯示遞迴錯誤

--建立ddl日誌表

create table ddl_log

(ddl_event varchar2(20),  --ddl事件

username varchar2(10),   --對應的資料庫登入使用者名稱

owner varchar2(10),      --對應的物件所有者名

objname varchar2(50),    --對應的資料庫物件名

objtype varchar2(10),    --對應的資料庫物件型別

time date                --對應的資料庫操作時間

)--建立ddl觸發器

create or replace trigger tr_ddl_log

after ddl on database

begin 

insert into ddl_log values(

ora_sysevent,ora_login_user,ora_dict_obj_owner,

ora_dict_obj_name,ora_dict_obj_type,sysdate

);end;

--測試:

SQL觸發器課堂筆記

建立觸發器 觸發器 保證資料完整性,與表事件相關的特殊的儲存過程,由事件觸發 比如當對乙個表進行操作時 alter,delete,update delete student where sno 1201011102 select from student where sno 1201011102 插...

9 1課堂筆記

課堂筆記 一 1 file類的構造方法 public file string pathname 根據parent抽象的路徑名和child路徑名字串建立乙個新的file物件。pathname指路徑名字串,parent父抽象路徑名 父抽象路徑名既可以是字串,也可以是file物件 public file ...

9 7課堂筆記

課堂筆記 執行緒的同步 為什麼需要 執行緒同步 執行緒間共享 和資料可以節省系統開銷,提高程式執行效率,但同時也導致了資料的 訪問衝突 問題,如何實現執行緒間的有機互動 並確保共享資源在某些關鍵時段只能被乙個執行緒訪問,即所謂的 執行緒同步 synchronization 就變得至關重要。臨界資源 ...