當前位置:首頁 » 編程語言 » oracle觸發器獲取sql

oracle觸發器獲取sql

發布時間: 2022-09-08 18:43:05

1. oracle觸發器中定時執行sql

1.
關於Oracle
觸發器中定時執行SQL
的問題,
Oracle觸
發器只是在表中數據被更新
如Insert,update,delete
等情況下才會觸發,不能做到定時,只是能是有變化時才會執行!
2.
要做到定時執行可使用Job
來完成
3.
數據已經完成插入,建議插入數據時,直接使用觸發器
4.
例2:限制對Departments表修改(包括INSERT,DELETE,UPDATE)的時間范圍,即不允許在非工作時間修改departments表。
CREATE OR REPLACE TRIGGER tr_dept_time
BEFORE INSERT OR DELETE OR UPDATE
ON departments
BEGIN
IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日')) OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '18:00') THEN
RAISE_APPLICATION_ERROR(-20001, '不是上班時間,不能修改departments表');
END IF;
END;

2. Oracle中觸發器有幾種,用法與SQL Server一樣嗎謝謝

ORACLE觸發器有以下兩類:
1
語句級(Statement-level)觸發器,在CREATE
TRIGGER語句中不包含FOR
EACH
ROW子句。語句級觸發器對於觸發事件只能觸發一次,
而且不能訪問受觸發器影響的每一行的列值。一般用語句級觸發器處理有關引起觸發器觸發的SQL語句的信息——例如,由誰來執行
2
行級(Row-level)觸發器,在CREATE
TRIGGER語句中包含FOR
EACH
ROW子句。行級觸發器可對受觸發器影響的每一行觸發,並且能
夠訪問原列值和通過SQL語句處理的新列值。行級觸發器的典型應用是當需要知道行的列值時,執行一條事務規則。
SQL
Server支持兩種類型的觸發器:
AFTER
觸發器和INSTEAD
OF
觸發器。其中AFTER
類型觸發器要求只有執行某一操作(INSERT
UPDATE
DELETE)
之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於AFTER
觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最後觸發,通常使用系統過程sp_settriggerorder
來完成此任務。
INSTEAD
OF
觸發器表示並不執行其所定義的操作(INSERT、
UPDATE、
DELETE),而僅是執行觸發器本身。既可在表上定義INSTEAD
OF
觸發器,也可以在視圖上定義INSTEAD
OF
觸發器,但對同一操作只能定義一個INSTEAD
OF
觸發器。

3. 請高手幫忙建個oracle建個全局觸發器 保存某用戶執行的所有SQL語句,

1.假設用戶abc
2.寫登錄觸發器,只要abc用戶登錄資料庫就跟蹤它
create or replace trigger sys_logon
after logon
on database
begin
if user='ABC' then
alter session set sql_trace=true;
end if;
end;
/
3.到user_mp_dest去找trace文件,用戶abc執行的sql都在裡面。
上面寫的觸發器可能會有些問題,沒有環境不好測試,但是基本的原理是這樣的,網上查找一下sql_trace的用法,應該比較清楚。還有,在一大堆文件里找那個trace文件可是不容易,你得想辦法知道登錄用戶的操作系統進程號才好找。

4. oracle 修改觸發器里的sql文

--設定:--TA(name varchar2(12),num varchar2(10),ydsalary number(12,2))--TB(name varchar2(12),num varchar2(10),ydsalary number(12,2),ynsalary number(12,2))--TC(name varchar2(12),num varchar2(10),ybsalary number(12,2))--TA不可以是視圖--觸發器寫在TA上,為插入前觸發:CREATE OR REPLACE TRIGGER TR_IB_TABEFORE INSERTON TAREFERENCING NEW AS New OLD AS OldFOR EACH ROWDECLAREyd TB.ydsalary%TYPE;BEGINSELECT ydsalary INTO yd FROM TB WHERE name=:NEW.name AND num = :NEW.num AND rownum=1;IF :NEW.ydsalary != yd THEN--這里有可能是負數哦insert into TC(name,num,ybsalary) values(:NEW.name,:NEW.num,:NEW.ydsalary - yd);END IF;EXCEPTION WHEN OTHERS THEN RAISE;END TR_IB_TA;/

5. oracle 觸發器sql怎麼寫

--設定:
--TA(namevarchar2(12),numvarchar2(10),ydsalarynumber(12,2))
--TB(namevarchar2(12),numvarchar2(10),ydsalarynumber(12,2),ynsalarynumber(12,2))
--TC(namevarchar2(12),numvarchar2(10),ybsalarynumber(12,2))
--TA不可以是視圖
--觸發器寫在TA上,為插入前觸發:
CREATEORREPLACETRIGGERTR_IB_TA
BEFOREINSERT
ONTA
REFERENCINGNEWASNewOLDASOld
FOREACHROW
DECLARE
ydTB.ydsalary%TYPE;
BEGIN
=:NEW.nameANDnum=:NEW.numANDrownum=1;
IF:NEW.ydsalary!=ydTHEN
--這里有可能是負數哦
insertintoTC(name,num,ybsalary)values(:NEW.name,:NEW.num,:NEW.ydsalary-yd);
ENDIF;
EXCEPTION
WHENOTHERSTHEN
RAISE;
ENDTR_IB_TA;
/

6. 如何在oracle 觸發器中執行mssql資料庫中的存儲過程的相關推薦

1:什麼叫存儲過程?
在oracle中,可以在資料庫中定義子程序,這種程序塊叫存儲過程(procere),它存放在數據字典中,可以在不同用戶和應用程序中共享,並可以實現程序的優化和重用。

2:存儲過程的有點?
 過程運行在伺服器端,執行速度快
 過程執行一次後代碼就駐留在高速緩存中,在以後的操作中,直接調用緩存數據。
 確保資料庫的安全性,可以不授權用戶直接訪問應用程序中的一些表,而是授權用戶執行訪問資料庫的過程。
 自動完成需要預先執行的任務,過程可以在系統啟動時自動運行。、

3:存儲過程的創建和執行
用戶存儲過程只能定義在當前資料庫中,可以使用sql語句或OEM創建。
默認情況下,用戶創建的存儲過程歸登錄資料庫的用戶所擁有,DBA可以把許可授權給其他用戶。
Sql命令創建存儲過程
CREATE procere 過程名
【(parameter parameter_mode date_type,….n)】
IS| AS
BEGIN
SQL_STATEMENT
END 過程名
其中
Parameter表示過程的參數。
parameter_mode:參數的類型,過程參數和函數參數一樣,有三種類型IN,OUT,IN OUT
IN 表示參數是輸入給過程的。
OUT表示採納數載過程中被賦值,可以傳給過程的外部。
IN OUT表示可以傳內,可以傳外。

調用存儲過程
直接輸入存儲過程的名字可以執行一個已經定義的存儲過程。

存儲過程的編輯修改
修改存儲過程雖然可以和修改視圖一樣,用ALTER procere,但是他是用來重新編譯和驗證用的,如果要修改過程定義,建議還是用create or replace。

存儲過程的刪除
當某個過程不再需要的時候,應該將其從內存中刪除,以釋放它佔用的資源。
Drop procere 存儲過程名。
Drop procere update_info.

觸發器
觸發器(trigger)是一些過程,與表聯系緊密,用於保護表中的數據,當一個基表被修改時,觸發器自動就會執行。例如出入其可以實現多個表間數據的一致性和完整性。
一般情況下,對表數據的操作有增刪查改,維護數據的觸發器也可以分為多種,每張基表最多可以建立12個觸發器。
1:Before insert 2:before insert fo each row; 3:after inert
4:after insert for each row 5:before update 6:before update for each row
7:after update 8:after update for each row; 9:before delete;
10:before delete for each row 11:after delete 12:after delete for each row.

利用sql語句創建觸發器
語法規則
Create or replace trigger 觸發器名
{before| after| instead of}
{delete 【or insert】【or update】【of column ….n 】}
On 表名|視圖名
【for each row 】[]where condition]]
Sql_statement[,,,n]

參數說明
Instead of :指定在創建替代觸發器。
Of column 指定在哪些列上進行觸發。。。
創建觸發器的限制
1:觸發器中有效的語句可以包括DML語句,但是不能包括DDL,rollback,commit
,savepoint都不適用。

7. 請教,oracle,要做觸發器,獲取用戶輸入的SQL語句函數是什麼

csdn的說,你這不掏RMB不好給你一對一的專家級answer,是不JJ.

8. Oracle中觸發器到SQL中怎麼寫請大神幫忙!

select count(*) into x1 from 訂單 where 訂單號=inserted.訂單號 and 顧客號=inserted.顧客號;

修改為

select
@x1 = count(*)
from
訂單, inserted
WHERE
訂單號=inserted.訂單號
and 顧客號=inserted.顧客號;

因為 在 SQL Server 裡面, 這個 inserted 是一個虛的表,而且是多行的。
不像 Oracle 裡面的 :new ,僅僅包含一行數據。

後面那個
if x1=0

要修改為
if @x1=0

9. 如何在觸發器中獲取SQL語句和執行前的值

目測語法是 Oracle 資料庫的語法。

那麼, 如果這個where aptitude.companyid=com_base.id;條件獲得上面執行的com_base.id怎麼獲取啊?

可以通過 :old.id 或者 :new.id 來獲取。

例如:

SQL> CREATE OR REPLACE TRIGGER BeforeUpdateTest
2 BEFORE UPDATE ON test_trigger_table
3 FOR EACH ROW
4 BEGIN
5 dbms_output.put_line('BEFORE UPDATE');
6 dbms_output.put_line('Old Name = ' || :old.name);
7 dbms_output.put_line('New Name = ' || :new.name);
8 END;
9 /

Trigger created.
SQL>
SQL> UPDATE test_trigger_table SET name = 'XYZ' WHERE id = 1;
BEFORE UPDATE
Old Name = ABC
New Name = XYZ

1 row updated.

熱點內容
自動充值腳本 發布:2025-01-13 07:48:02 瀏覽:19
越容易壓縮 發布:2025-01-13 07:37:37 瀏覽:557
ecstore資料庫 發布:2025-01-13 07:29:43 瀏覽:296
手機設置密碼忘記了怎麼解開 發布:2025-01-13 07:28:29 瀏覽:21
存儲卡交流 發布:2025-01-13 07:16:06 瀏覽:984
php字元串浮點數 發布:2025-01-13 07:15:28 瀏覽:999
python排序cmp 發布:2025-01-13 07:09:04 瀏覽:73
雲腳本精靈 發布:2025-01-13 07:03:27 瀏覽:619
高維訪問 發布:2025-01-13 07:03:23 瀏覽:976
保衛蘿卜有腳本嗎 發布:2025-01-13 06:30:29 瀏覽:743