--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 就變得至關重要。臨界資源 ...