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

sql觸發器增刪觸發

發布時間: 2022-12-25 04:50:19

1. sql用觸發器實現 2個表 數據關聯,插入更新和刪除

建議將insert ,update 和Delete 單獨創建觸發器
觸發器中只有inserted ,deleted
insert 時inserted有值
update時,inserted和deleted都有值,deleted是修改前的值,inserted是修改後的
delete時,只有deleted有值

2. sql中如何建立一個觸發器,使插入或刪除某條記錄時,系統能自動進行相關的提示

觸發器只能刪除或修改後返回一個值,這時程序後台代碼在根據這個值進行相應的提示操作。
相關步驟:
1、客戶端點擊刪除
2、調用服務端刪除表的方法,同時獲取刪除成功或者失敗的返回值
3、伺服器把值傳遞給客戶端
4、客戶端獲取到值顯示在某個label中或者彈出提出

3. SQL求助 插入刪除修改的觸發器代碼編寫

---創建測試表:
Create Table MyTest(
id int identity(1,1) not null primary key,
[name] varchar(100) null
)
--創建觸發器:
CREATE TRIGGER trigtest--創建觸發器trigtest
ON mytest--在表mytest上建
for INSERT,DELETE,UPDATE--為插入,刪除,修改
AS
BEGIN
declare @a int,
@b int,
@id int,
@name varchar(100),
@oldId int,--原ID號
@oldName varchar(100)--原來的name
set @a=0
set @b=0
if exists(select * from inserted)--如果存在插入新的數據則設置@a=1
begin
set @a=1
end
if exists(select * from deleted)--如果存在刪除數據則設置@b=1
begin
set @b=1
end
if (@a=1)and(@b=0)--新增:當插入表inserted存在數據而刪除表deleted不存數據時,為新增操作。
begin
select @id=id,@name=name from inserted
print '增加了ID號為【'+cast(@id as varchar(5))+'】Name為【'+@name+'】的數據!'
end
if (@a=1)and(@b=1)--修改:當插入表insertedt和刪除表deleted都存在數據時,為修改操作。
begin
select @id=id,@name=name from inserted
select @id=id,@oldname=name from deleted
print '修改了ID號為【'+cast(@id as varchar(5))+'】的數據Name由【'+@oldname+'】變為【'+@name+'】'
end
if (@a=0)and(@b=1)--刪除:當插入表inserted不存在數據而刪除表deleted存在數據時,為刪除操作。
begin
select @id=id,@name=name from deleted
print '刪除了ID號為【'+cast(@id as varchar(5))+'】Name為【'+@name+'】的數據!'
end
END

4. SQL如何創建刪除的觸發器

CREATE TRIGGER A表_DEL
ON A表FOR DELETE
AS
--SET NOCOUNT ON
DELETE E
FROM A表 E
INNER JOIN deleted D ON E.主鍵ID = D.主鍵ID

5. SQL中觸發器有什麼作用

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

6. sql server中的觸發器問題:當批量增刪數據時,inserted和deleted中的數據會多於一行嗎

會,當sql server , update 或delete 多條記錄時,觸發器只觸發一次,
inserted和deleted中的數據是 update 或 delete 的所有記錄

7. 請問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行;
可見,表級觸發器在更新了多行的情況下,只觸發了一次;

8. SQL觸發器實現兩張表增刪改級聯 資料庫不在同一台伺服器上 怎麼實現

同一伺服器可以
在語句 表 的前面加上 資料庫名.dbo
例如 insert into table_XFBD2 改成 INsert Into 新庫.dbo.table_XFBD2
前提執行這個觸發器的用戶必須在另外一個庫上也有許可權

不同伺服器的話可以用鏈接伺服器來實現,參考
http://yunlongzheng.blog.51cto.com/788996/468478

9. sql server 2005 寫觸發器 ,要求 A表中做了增刪該, B 表將記錄他的 操作信息!

create trigger AfterA on A for
insert,update,delete
as
declare @id int;
begin
if exists(select 1 from inserted) and not exists (select 1 from deleted)
begin
insert into b select inserted.id,'1',getdate() from inserted
end
if exists(select 1 from inserted) and exists (select 1 from deleted)
begin
insert into b select inserted.id,'3',getdate() from inserted,deleted where inserted.id = deleted.id
end
if not exists(select 1 from inserted) and exists (select 1 from deleted)
begin
insert into b select deleted.id,'2',getdate() from deleted;
end
end
----1、2、3分別對應了增刪改操作