當前位置:首頁 » 編程語言 » sql觸發器insert實例
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql觸發器insert實例

發布時間: 2022-06-14 04:51:30

sql 觸發器 insert 格式

給一個觸發器的格式,應該很容易看懂
1、建表
a,b
語句如下:
create
table
a(id
number(10)
not
null,name
varchar2(256));
create
table
b(id
number(10)
not
null,name
varchar2(256),update_date
date,flag
int
);--flag
0:新增
1:修改
2、建行級觸發器如下:
create
or
replace
trigger
tr_save_change
after
insert
or
update
or
delete
on
a
for
each
row
begin
case
when
inserting
then
insert
into
b(id,name,update_date,flag)
values(:new.id,:new.name,sysdate,0);
when
updating
then
update
b
set
name=:new.name,update_date=sysdate,flag=1
where
id=:old.id;
when
deleting
then
delete
from
b
where
id=:old.id;
end
case;
end;
3、測試如下:
insert
into
a(id,name)
values(1,'aaa');
commit;
--查看b表
select
*
from
b;
insert
into
a(id,name)
values(2,'bbb');
commit;
--查看b表
select
*
from
b;
update
a
set
name='abab'
where
id=2;
commit;
--查看b表
select
*
from
b;
delete
from
a
where
id=1;
commit;
--查看b表
select
*
from
b;

Ⅱ SQL server觸發器中 update insert delete 分別寫個例子

create trigger T1 on student
for insert
as
print '添加了一條記錄'
go

create trigger T2 on student
for update
as
print '更新了一條記錄'
go

create trigger T3 on student
for delete
as
print '刪除了一條記錄'
go

Ⅲ SQL語句創建INSERT觸發器

create trigger TriggerName on TableName
after upate,insert, delete
as
begin

....................................
end

Ⅳ Sql Server 觸發器問題,觸發器觸發的條件有 insert,update,delete ,我想要一個例子 在一個表建立一個觸

create trigger tr_a
on a
for insert,update,delere as
begin

IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
BEGIN
-- 插入觸發.
INSERT INTO B
SELECT
inserted.a
FROM
inserted;
END;

IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
BEGIN
-- 更新觸發.
DELETE FROM B WHERE a in ( SELECT a FROM deleted);

INSERT INTO B
SELECT
inserted.a
FROM
inserted;
END;

IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
BEGIN
-- 刪除觸發
DELETE FROM B WHERE a in ( SELECT a FROM deleted);

END;

end

Ⅳ SQL中觸發器有什麼作用

觸發器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發器是一個能由系統自動執行對資料庫修改的語句。
觸發器與存儲過程的唯一區別是觸發器不能執行EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發執行。
觸發器可以查詢其他表,而且可以包含復雜的SQL語句。它們主要用於強制服從復雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用資料庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。
SQL Server 包括三種常規類型的觸發器:DML 觸發器、DDL 觸發器和登錄觸發器。
語法為:
CREATE TRIGGER `<databaseName>`.`<triggerName>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON [dbo]<tableName> //dbo代表該表的所有者
FOR EACH ROW
BEGIN
--do something
END
觸發器可通過資料庫中的相關表實現級聯更改,不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用CHECK約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的對策以響應同一個修改語句。
約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用 Transact-SQL 代碼的復雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。實體完整性總應在最低級別上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過 CHECK 約束進行強制,而引用完整性(RI) 則應通過 FOREIGN KEY 約束進行強制。在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。
CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。約束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為復雜的錯誤處理,則必須使用觸發器。
觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在 titleauthor.title_id 上創建一個插入觸發器,使它在新值與 titles.title_id 中的某個值不匹配時回滾一個插入。不過,通常使用 FOREIGN KEY 來達到這個目的。
如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。
實例1:insert觸發器
create trigger tri_insert
on student
for insert
as
declare @student_id char(10)
select @student_id=s.student_id from
student s inner join inserted i
on s.student_id=i.student_id
if @student_id='0000000001'
begin
raiserror('不能插入1的學號!',16,8)
rollback tran
end
go
實例2:update觸發器
create trigger tri_update
on student
for update
as
if update(student_id)
begin
raiserror('學號不能修改!',16,8)
rollback tran
end
go
實例3:delete觸發器示
create trigger tri_delete
on student
for delete
as
declare @student_id varchar(10)
select @student_id=student_id from deleted
if @student_id='admin'
begin
raiserror('錯誤',16,8)
rollback tran
end

Ⅵ 請問sql觸發器insert觸發器如何使用

DML觸發器有三類:
1, insert觸發器;
2, update觸發器;
3, delete觸發器;
觸發器的組成部分:
觸發器的聲明,指定觸發器定時,事件,表名以類型
觸發器的執行,PL/SQL塊或對過程的調用
觸發器的限制條件,通過where子句實現
類型:
應用程序觸發器,前台開發工具提供的;
資料庫觸發器,定義在資料庫內部由某種條件引發;分為:
DML觸發器;
資料庫級觸發器;
替代觸發器;
DML觸發器組件:
1,觸發器定時
2,觸發器事件
3,表名
4, 觸發器類型
5, When子句
6, 觸發器主體
可創建觸發器的對象:資料庫表,資料庫視圖,用戶模式,資料庫實例
創建DML觸發器:
Create [or replace] trigger [模式.]觸發器名
Before| after insert|delete|(update of 列名)
On 表名
[for each row]
When 條件
PL/SQL塊
For each row的意義是:在一次操作表的語句中,每操作成功一行就會觸發一次;不寫的話,表示是表級觸發器,則無論操作多少行,都只觸發一次;
When條件的出現說明了,在DML操作的時候也許一定會觸發觸發器,但是觸發器不一定會做實際的工作,比如when 後的條件不為真的時候,觸發器只是簡單地跳過了PL/SQL塊;
Insert觸發器的創建:
create or replace trigger tg_insert
before insert on student
begin
dbms_output.put_line('insert trigger is chufa le .....');
end;
執行的效果:
SQL> insert into student
2 values(202,'dongqian','f');
insert trigger is chufa le .....
update表級觸發器的例子:
create or replace trigger tg_updatestudent
after update on student
begin
dbms_output.put_line('update trigger is chufale .....');
end;
運行效果:
SQL> update student set se='f';
update trigger is chufale .....
已更新8行;
可見,表級觸發器在更新了多行的情況下,只觸發了一次;

Ⅶ 有關sql insert觸發器和update觸發器

DML觸發器有三類:

1, insert觸發器;

2, update觸發器;

3, delete觸發器;

觸發器的組成部分:

觸發器的聲明,指定觸發器定時,事件,表名以類型

觸發器的執行,PL/SQL塊或對過程的調用

觸發器的限制條件,通過where子句實現

類型:

應用程序觸發器,前台開發工具提供的;

資料庫觸發器,定義在資料庫內部由某種條件引發;分為:

DML觸發器;

資料庫級觸發器;

替代觸發器;

DML觸發器組件:

1,觸發器定時

2,觸發器事件

3,表名

4, 觸發器類型

5, When子句

6, 觸發器主體

可創建觸發器的對象:資料庫表,資料庫視圖,用戶模式,資料庫實例

創建DML觸發器:

Create [or replace] trigger [模式.]觸發器名

Before| after insert|delete|(update of 列名)

On 表名

[for each row]

When 條件

PL/SQL塊

For each row的意義是:在一次操作表的語句中,每操作成功一行就會觸發一次;不寫的話,表示是表級觸發器,則無論操作多少行,都只觸發一次;

When條件的出現說明了,在DML操作的時候也許一定會觸發觸發器,但是觸發器不一定會做實際的工作,比如when 後的條件不為真的時候,觸發器只是簡單地跳過了PL/SQL塊;

Insert觸發器的創建:

create or replace trigger tg_insert

before insert on student

begin

dbms_output.put_line('insert trigger is chufa le .....');

end;

/

執行的效果:

SQL> insert into student

2 values(202,'dongqian','f');

insert trigger is chufa le .....

update表級觸發器的例子:

create or replace trigger tg_updatestudent

after update on student

begin

dbms_output.put_line('update trigger is chufale .....');

end;

/

運行效果:

SQL> update student set se='f';

update trigger is chufale .....

已更新8行;

可見,表級觸發器在更新了多行的情況下,只觸發了一次;

如果在after update on student後加上

For each row的話就成為行級觸發器,運行效果:

SQL> update student set se='m';

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

update trigger is chufale .....

已更新8行;

:new 與: old:必須是針對行級觸發器的,也就是說要使用這兩個變數的觸發器一定有for each row

這兩個變數是系統自動提供的數組變數,:new用來記錄新插入的值,old用來記錄被刪除的值;

使用insert的時候只有:new里有值;

使用delete的時候只有:old里有值;

使用update的時候:new和:old里都有值;

可以這樣使用: dbms_output.put_line('insert trigger is chufa

dbms_output.put_line('new id is : '||:new.stui

dbms_output.put_line('new name is : '||:new.st

dbms_output.put_line('new se is : '||:new.se);

可以這樣從數據字典中查看一個表上有哪幾個觸發器:

SQL> select trigger_name from user_triggers

2 where table_name=upper('student');

TRIGGER_NAME

------------------------------

TG_INSERT

TG_UPDATESTUDENT

帶有:old變數的行級delete觸發器:

create or replace trigger tg_deletestudent

before delete on student

for each row

begin

dbms_output.put_line('old is: '||:old.stuid);

dbms_output.put_line('old name: '||:old.stuname);

end;

/

運行效果:

SQL> delete from student;

old is: 202

old name: dongqian

old is: 101

old name: liudehua

old is: 102

old name: lingqingxia

old is: 103

old name: lichanggong

old is: 104

old name: zhenxiuwen

old is: 1001

old name: lilianjie

old is: 1009

old name: tongleifuck

old is: 203

old name: kfdj

old is: 209

old name: fuck

已刪除9行

When的使用:如果在begin也就是說觸發器的PL/SQL主體塊執行前加上when(old.se=』f』)的話,DML操作照做不誤,但是只會在刪除

Se=』f』的那行的時候才會執行觸發器的主體動作,執行效果:

SQL> delete from student;

old is: 209

old name: fuck

已刪除9行; 這里雖然刪了9行,但是只執行了一次觸發器的主體,做為一個行級觸發器;

混合類型觸發器:

Inserting,deleting,updating三個謂詞可以分別指示當前操作到底是哪個;

create or replace trigger hunhetrigger

before insert or update or delete on student

for each row

begin

if inserting then

dbms_output.put_line('insert le.........');

end if;

if deleting then

dbms_output.put_line('delete le .......');

end if;

end;

/

插入的時候就自動判斷當前動作為插入:

SQL> insert into student values(303,'me','f');

insert le.........

刪除的時候就自動判斷當前動作為刪除:

SQL> delete from student;

delete le .......

注意,既然觸發器內部的主體PL/SQL是語句,那麼它同樣也可以是插入刪除操作而不一定只是dbms_output列印一些信息;

這正是日誌表的原理:在用戶執行了DML語句的時候觸發主體為插入日誌表以記錄操作軌跡的觸發器;

為什麼用觸發器? 當我們有兩個表用來記錄商品的出庫入庫情況,good_store用來記錄庫存的產品類別和數量,

而good_out用來記錄出庫的產品類別和數量,那麼每當我們出庫的某個類別的產品一定數量的時候,我們應該在good_out中插入該產品的類別和

出庫數量,而同時也應該在good_store表中用update來更新庫存的相應類別的產品的數量;這就交給了我們兩個必須完成的任務:插入good_out

表後更新good_store表,這樣的手工過程使得我們覺得非常ugly,如果只做其中一個那造成數據的不一致;所以現在我們可以用觸發器,在

Good_out表的插入操作上綁定一個對good_store進行更新的觸發器;當然這個過程應該是一個事務,你不必擔心插入good_out表執行了,而綁定在這個動作上的觸發器操作不會執行,相信Oracle設計為原子性了;

注意:觸發器會使得原來的SQL語句速度變慢;

替代觸發器:

創建在視圖上的觸發器,就是替代觸發器,只能是行級觸發器;

為什麼要用替代觸發器?

假如你有一個視圖是基於多個表的欄位連接查詢得到的;現在如果你想直接對著這個視圖insert;那你一定在想,我對視圖的插入操作

怎麼來反應到組成這個視圖的各個表中呢?事實上,除了定義一個觸發器來綁定在對視圖上的插入動作上外,你沒有別的辦法通過系統的報錯而直接向視圖中插入數據;這就是我們用替代觸發器的原因;替換的意思實際上是觸發器的主體部分把對視圖的插入操作轉換成詳細的對各個表的插入;

變異表:變異表就是當前SQL語句正在修改的表,所以在一個變異表上綁定的觸發器不可以使用cout()函數,原因很簡單:SQL語句剛剛修改了表,你怎麼統計??

約束表:

維護:

Alter trigger …..disenable; 使得觸發器不可用;

Alter trigger ……enable; 開啟觸發器;

Oracle的內置程序包

擴展資料庫的功能;

為PL/SQL提供對SQL功能的訪問

一般具有sys許可權的高級管理人員使用;

一個典型的程序包就是dbms_output,你老是用它的過程put_line();

Dbms_standard 提供語言工具;

Dbms_lob操作Oracle LOB;就是針對大型數據的操作設計的;

Dbms_lock用戶定義的鎖;

Dbms_job 允許對PL/SQL過程進行調度;

Dbms_alert 支持資料庫事件的非同步通知;

1,dbms_output的一些過程:

a):enable

b):disable

c):put只是把數據放到緩存(SQL-Plus的緩存,實際就是整個窗口)中,無輸出功能;

d):put_line可以使得以前放在緩存中所有數據輸出;並且換到下一行;

e):new_line

f):get_line

g):get_lines

2,dmbs_lob ,這個包只能是由系統管理員來操作;

Clob以字元數據存儲可達2G;

Blob以二進制數據存儲可達4G;

Nclob以unicode字元存儲;

一個文件下載列表的例子:

創建下載目錄表:

create table downfilelist

(

id varchar(20) not null primary key,

name varchar(40) not null,

filelocation bfile,

description clob

)

/

創建目錄:

create or replace directory filedir as 'f:\oracle'

/只是向Oralce注冊了目錄,實際上並不會真的建立目錄在磁碟上;Oracle無權管理和鎖定操作系統的文件系統;

向目錄表中插入數據:

insert into downfilelist

values('10001','oracle plsal編程指南',bfilename(upper('filedir'),'demo.mp3'),'this is a mp3 music')

insert into downfilelist

values('10002','java 大權', bfilename(upper('filedir'),'x.jpg'),'good super girl')

/在filedir的目錄f:\oracle下實際存儲著demo.mp3 ,x.jpg;

注意,如果你試圖查詢,效果是 :

sys>select * from downfilelist;

SP2-0678: 列或屬性類型無法通過 SQL*Plus 顯示

因為第三列是無法顯示的,是一個二進制的;

下面使用dbms_lob的一些過程來進行操作:

1,read過程

declare

tempdesc clob;

ireadcount int;

istart int;

soutputdesc varchar(100);

begin

ireadcount:=5;

istart:=1;

select description into tempdesc from downfilelist where id='10001';

dbms_lob.read(tempdesc,ireadcount,istart,soutputdesc); 把clob類型的tempdesc中的數據讀到字元類型的soutputdesc里;

dbms_output.put_line('Top 5 character is: '||soutputdesc);

end;

/注意,對unicode來說,漢字和字母所佔的位數是一樣的;

2,getlength函數

select description into tempclob from downfilelist where id=『10001』;

ilen:=dbms_lob.GetLength(tempclob);

append,……..

發現這樣的現象:select x into y的時候,y並不是獨立於x的拷貝,因為當修改y的時候x也被修改了;

3, fileexists函數

select id ,dbms_lob.fileexists(filelocation) from downfilelist;

如果在bfile類型欄位filelocation指定的系統下的目錄中存在filelocation指定的系統文件,則返回int 1,否則返回0;

這說明Oracle還是可以檢測到系統的文件情況的,如同java.io包里的類一樣;

對bfile類型數據的操作函數有fileisopen,fileopen,fileclose等等;

如果對您有幫助,請記得採納為滿意答案,謝謝!祝您生活愉快!

vaela

Ⅷ SQL server觸發器中 update insert delete 分別給寫個例子被。

INSERT:

表1(ID,NAME)
表2(ID,NAME)
當用戶插入表1數據後,表2也被插入相同的數據
CREATETRIGGERTRI1
ON表1
FORINSERT
AS
BEGIN
INSERTINTO表2SELECT*FROMINSERTED
END
GO

DELETE:

表1(ID,NAME)
表2(ID,AGE,GENDER)
當用戶刪除表1某條ID的數據後,表2相應ID的數據也被刪除
CREATETRIGGERTRI2
ON表1
FORDELETE
AS
BEGIN
DECLARE@idINT
SELECT@idFROMDELETED
DELETE表2
WHEREID=@id
END
GO

UPDATE:

表1(ID,NAME)
表2(ID,NAME)
當用戶更改表1NAME列數據後,表2相應ID的數據也同時更新
CREATETRIGGERTRI3
ON表1
FORUPDATE
AS
IFUPDATE(NAME)
BEGIN
UPDATE表2
SETA.NAME=B.NAME
FROM表2A,INSERTEDB
WHEREA.ID=B.ID
END
GO

Ⅸ SQL的Insert觸發器實現

--我是在SQL2005下寫的 2005一下版本可能會有問題 請參考

--表1
IF OBJECT_ID('tbl_qxt') IS NOT NULL
begin
DROP TABLE tbl_qxt
end
GO
CREATE TABLE tbl_qxt
(ID int identity(1,1),CREATORID int,INSERTIME datetime,[COUNT] varchar(500))

--表2
if object_id('tbl_user') is not null
begin
drop table tbl_user
end
go
create table tbl_user
(ID int identity(1,1),CREATORID int,USERNAME varchar(50),[PASSWORD] varchar(50))

--給表1加觸發器
if object_id('trigger1') is not null
begin
drop trigger trigger1
end
go
create trigger trigger1 on tbl_qxt after insert
as
begin
if exists(select 1 from tbl_user u inner join inserted i on u.CREATORID=i.CREATORID)
begin
print 1
update tbl_qxt set [COUNT]=cast(i.[COUNT] as varchar) +'【'+cast(u.USERNAME as varchar)+'】'
from inserted i inner join tbl_user u
on u.CREATORID=i.CREATORID
where tbl_qxt.ID in(select max(id) from tbl_qxt)
end
end

go
delete from tbl_user
--先往表2裡面先插入4條記錄
insert into tbl_user(CREATORID,USERNAME,[PASSWORD])
values(1,'admin','admin')
insert into tbl_user(CREATORID,USERNAME,[PASSWORD])
values(2,'test','test')
insert into tbl_user(CREATORID,USERNAME,[PASSWORD])
values(3,'sys','sys')
insert into tbl_user(CREATORID,USERNAME,[PASSWORD])
values(4,'QXT','QXT')
go
delete from tbl_qxt
--測試觸發器,往表1中插入數據
insert into tbl_qxt(CREATORID,INSERTIME,[COUNT])
values(1,getdate(),'AAAABBB')
insert into tbl_qxt(CREATORID,INSERTIME,[COUNT])
values(2,getdate(),'BBBBCCC')
insert into tbl_qxt(CREATORID,INSERTIME,[COUNT])
values(3,getdate(),'DDDDEEE')
insert into tbl_qxt(CREATORID,INSERTIME,[COUNT])
values(4,getdate(),'FFFFGGG')

--查看結果
select * from tbl_qxt

--觸發器中間那個print 1可以去掉 那是我測試的時候用的

Ⅹ sql觸發器 insert

CREATETRIGGERtr_test
ONa表
AFTERINSERT
AS
BEGIN
UPDATEB表SETdate=DATEADD(date,1,year)WHEREID=(SELECTIDFROMINSERTED)
END

/*說明:INSERTED 在微軟SQL Server里稱為虛擬表(INSERT動作時觸發)

而在甲骨文(Oracle)里稱為內存表。--只是叫法不一樣罷了。

*/