日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

SQL server与Oracle触发器的创建与使用

發布時間:2025/6/17 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL server与Oracle触发器的创建与使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SQL Server

1創建觸發器

GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE TRIGGER WMY ON Student Instead of INSERT AS BEGININSERT INTO Student (number,name) VALUES (1205,'角色2'); END; --Begin 與end相當于{},是一個語句塊,可有可無此處為演示所用 --ON 后面跟表明,表示作用于那個表 --ON Student下面(Instead of INSERT)可有改為(Instead of,after,for)(update,delete,Insert)

解析(以上列Insert觸發器為例其他雷同)(以下先后順序以插入表中數據的排序為例)

  • 當為Instead of 時,在觸發器中的SQL語句代替你文中執行的插入語句,即當你在任何地方執行一個插入語句,這條語句實際沒有執行而觸發器里面的語句則執行
  • 當為for 時,在觸發器中的SQL語句與你文中執行的插入語句都執行只是觸發器中先于文中的執行
  • 當為 After時?在觸發器中的SQL語句與你文中執行的插入語句都執行只是觸發器中晚于文中的執行(網上都這樣說可簡單測試時與for效果一樣)

摘自網上:

1 “Instead of”觸發器

  • “Instead of”觸發器在執行真正“插入”之前被執行。除表之外,“Instead of” 觸發器也可以用于視圖,用來擴展視圖可以支持的更新操作。
  • “Instead of”觸發器會替代所要執行的SQL語句,言下之意就是所要執行SQL并不會“真正執行”

2 “After”觸發器

  • “After”觸發器在Insert、Update或Deleted語句執行之后被觸發。“After”觸發器只能用于表。
  • “After”觸發器主要用于表在修改后(insert、update或delete操作之后),來修改其他表

SQL Server為每個觸發器都創建了兩個專用表:Inserted表和Deleted表

  • 這兩個表由系統來維護,它們存在于內存中而不是在數據庫中,可以理解為一個虛擬的表。
  • 這兩個表的結構總是與被該觸發器作用的表的結構相同。
  • 觸發器執行完成后,與該觸發器相關的這兩個表也被刪除。
  • Deleted表存放由于執行Delete或Update語句而要從表中刪除的所有行。
  • Inserted表存放由于執行Insert或Update語句而要向表中插入的所有行。
GO INSERT INTO Student (number,name) VALUES (1807,'角色');

深度解析使用序列以及Inserted表

USE [OSMP] BEGIN IF EXISTS (SELECT * FROM sysobjects WHERE name = 'Person') AND NOT EXISTS (select * from Person) --這條語句的意思是當表存在并且不為空是執行下面的語句 ,and對應&&,or 對應|| DROP table Person END GO CREATE TABLE Person (num int,S_score int,S_name NVARCHAR(64),primary key (num) ) BEGIN IF EXISTS (SELECT * FROM sysobjects WHERE name = 'Student') AND NOT EXISTS (select * from Student) DROP table Student END GO CREATE TABLE Student (score int,name NVARCHAR(64),primary key (name) ) --創建序列 BEGIN IF EXISTS (SELECT * FROM sysobjects WHERE name = 'Student_SEQ') DROP SEQUENCE Student_SEQ END CREATE SEQUENCE Student_SEQ MINVALUE 1 MAXVALUE 999999999999 START WITH 1 INCREMENT BY 1 CACHE 20;GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE TRIGGER WMY ON Student instead of INSERT AS BEGIN Insert into Person (num,S_score,S_name)select next value for Student_SEQ,score,name from Inserted --Insert into Person (num,S_score,S_name)select next value for Student_SEQ,a.* from Inserted a --簡化寫法
--Insert into Person select next value for Student_SEQ,* from Inserted --此處并無意思主要用于理解,執行下面的Student插入語句是,數據庫維護了一個與Student數據結構一樣的表Inserted,
--這里利用這個表和序列值來為Person做插入,而實際上沒有執行Student插入,如果想要Student也執行把Instead of 改為for或after END; GO Insert into Student(score,name) values('1','m');

插曲獲取序列的當前值

GO SELECT current_value FROM sys.sequences WHERE name = 'Student_SEQ'

sql server定義變量以及變量賦值

DECLARE @index VARCHAR(20),@Orderindex VARCHAR(20); select @index=next value for ENTITY_SEQ; select @Orderindex= 'R_'+rtrim(ltrim(right(cast('00000000'+rtrim(cast(@index as int)) as varchar(20)),10)))

  

Oracle 觸發器與SQL server類似,在此只顯示代碼

new是新插入的數據,old是原來的數據insert只會有new,代表著要插入的新記錄delete只會有old,代表著要刪除的記錄update由于執行的是先刪除舊的記錄,再插入新的記錄,因此new和old都會有,且含義與上面的相同 注:update觸發器,可根據具體需求選擇記錄舊記錄還是新記錄。

? *這兩個變量只有在使用了關鍵字 "FOR EACH ROW"時才存在.且update語句兩個都有,而insert只有:new ,delect 只有:old;

? * for each row 指定觸發器每行觸發一次

BEGINEXECUTE IMMEDIATE 'DROP TABLE Person';EXCEPTION WHEN OTHERS THEN NULL; END;CREATE TABLE Person (num INTEGERS_score INTEGER,S_name NVARCHAR2(64),primary key (num) ) BEGINEXECUTE IMMEDIATE 'DROP TABLE Student';EXCEPTION WHEN OTHERS THEN NULL; END;CREATE TABLE Student (score INTEGER,name NVARCHAR2(64),primary key (name) ) --創建序列 BEGINEXECUTE IMMEDIATE 'DROP SEQUENCE Student_SEQ';EXCEPTION WHEN OTHERS THEN NULL; END; CREATE SEQUENCE Student_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 20; CREATE OR REPLACE TRIGGER TR_INST_DEVICE BEFORE INSERT ON M_DEVICEENTITY FOR EACH ROWBEGINselect Student_SEQ.NEXTVAL into :new.num from dual;--select 'A' || trim(to_char(:new.num, '00000000')) into :new.score from dual;--這個兩語句作用并無練習,第一個取出序列的下一個值插入new表中(new表類似SQL server 中的Inserted)--更改score的標示發以A_0000001為樣式,這個語句只做參考在此處無用也運行不了(因為表的字段類型) END; GO
Insert into Student(score,name) values('1','m')

 Intert into Select值與表組合的表示方法

Insert into Person(n, num, name) select next value for ENTITY_SEQ,number,name from Student where number=114; --next value for ENTITY_SEQ序列與select字段組合添加 Insert into Person(n, num, name) select cast(100 as int),number,name from Student where number=114; --cast(100 as int)值與字段組合添加

 C# 中Oracle分頁寫法 end,start為傳入的數值,

cmd.CommandText = @"SELECT * FROM (SELECT ROWNUM AS rowno, t.* FROM '+tablename +' tWHERE ROWNUM <= '" + end + "') table_alias WHERE table_alias.rowno >= '" + start + "'";

 

cmd.CommandText = @"select * from M_ORDERHANDLE where ORDERINDEX = '" + orderindex + "'";

  

SELECT *FROM (SELECT ROWNUM AS rowno, t.*FROM emp tWHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')AND TO_DATE ('20060731', 'yyyymmdd')AND ROWNUM <= 20) table_aliasWHERE table_alias.rowno >= 10;

  

SELECT * FROM (SELECT * FROM M_ALARM ) WHERE ROWNUM <=500 ORDER BY ROWNUM Desc;

  

--Oracle環境下的時間比對語句 SELECT * FROM M_WORKORDER where CREATETIME >= to_date('2015/03/23','yyyy-mm-dd hh24:mi:ss') and
CREATETIME <= to_date('2016/03/23','yyyy-mm-dd hh24:mi:ss')SELECT * FROM M_WORKORDER where to_char(CREATETIME, 'yyyy-mm-dd hh24:mi:ss') >= '2015-03-01 00:00:00' and
to_char(CREATETIME, 'yyyy-mm-dd hh24:mi:ss') <= '2016-04-05 00:00:00' --注意時間格式轉換為一致

  

//Oracle多表連接查詢 string sql = @"SELECT W.*, D.*, AH.*, A.ALARMDESCRIPTION, A.DETECTTIME, A.ALARMPHENOMENON, A.ENTITYTYPEFROM M_WORKORDER W, M_ALARM A,(SELECT * FROM(SELECT ROW_NUMBER() OVER (PARTITION BY H.ALARMINDEX ORDER BY H.HANDLETIME DESC) N,H.* FROM M_ALARMHANDLE H)WHERE N = 1) AH,(SELECT * FROM M_CONFIGITEMRELATION C, M_BUSINESSENTITY B WHERE C.TARGETINDEX = B.ENTITYINDEX AND C.GROUPTYPE = 1) D WHERE W.ALARMINDEX = D.SOURCEINDEX(+) AND W.ALARMINDEX = AH.ALARMINDEX(+) ANDA.ALARMINDEX = W.ALARMINDEX AND
to_char(CREATETIME, 'yyyy-mm-dd') >= '" + Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd") + "' and
to_char(CREATETIME, 'yyyy-mm-dd') <= '" + Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd") + "' and rownum<20";

  注意 (+)左右邊對應的是左右連接,

//SQL server 對應的多表連接查詢 string sql = @"SELECT W.*, D.*, AH.*, A.ALARMDESCRIPTION, A.DETECTTIME, A.ALARMPHENOMENON, A.ENTITYTYPEFROM M_ALARM A,M_WORKORDER W LEFT JOIN(SELECT * FROM (SELECT ROW_NUMBER() OVER (PARTITION BY H.ALARMINDEX ORDER BY H.HANDLETIME DESC) N,H.* FROM M_ALARMHANDLE H) MWHERE M.N=1)AH on W.ALARMINDEX = AH.ALARMINDEX LEFT JOIN(SELECT * FROM M_CONFIGITEMRELATION C, M_BUSINESSENTITY B WHERE C.TARGETINDEX = B.ENTITYINDEX AND C.GROUPTYPE = 1)D ON W.ALARMINDEX = D.SOURCEINDEXWHERE A.ALARMINDEX = W.ALARMINDEX and CONVERT(varchar(100),w.createtime, 20) >= '" +
Convert.ToDateTime(StartTime).ToString("yyyy-MM-dd") + "' and
CONVERT(varchar(100),w.createtime, 20) <= '" + Convert.ToDateTime(EndTime).ToString("yyyy-MM-dd") + "'";

SQL server Select Into用法詳解

http://wenku.baidu.com/link?url=I7DrdMzq7-ONDePwrmkHJjofYiS1KL6kyT9pzVcLvz4g0eSxoKH0lvfJYtEcJhxgsfVrB9uHokJRHjHC43kj6sxN5bVCQUoSh-B-IB5tQHC

SQL server 觸發器里面判斷是什么引發的觸發

http://www.2cto.com/database/201308/238647.html

?

?

轉載于:https://www.cnblogs.com/wangboke/p/5502293.html

總結

以上是生活随笔為你收集整理的SQL server与Oracle触发器的创建与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。