❶ sql觸發器怎麼做
二樓的說的對,insert
into...select
語句是復製表a的數據到表b里,而且表2不能自定義,是由語句創建的,如果表b已經存在則會出錯.
如果樓主要執行insert
into...select,首先要判斷插入的表是否已經存在,如果存在要將其刪除後在執行.
樓主如果你只是想把剛插入的數據的那3列在插入到另一個表裡,完全沒必要那樣做,直接從inserted表(這個表只在insert觸發器適用)里讀就能讀的到剛插入的內容了,讀取出來後在用insert
語句插入到另一個表即可.
❷ 如何設置SQL 觸發器
一、什麼是PPT中的觸發器
1
在通常情況下,用 PowerPoint 製作出來的演示文稿,其播放順序是固定的,這樣就在一定程度上影響了演示文稿的交互性。
❸ sql 觸發器的使用方法
深刻理解 FOR CREATE TRIGGER 語句的 FOR 關鍵字之後可以跟 INSERT、UPDATE、DELETE 中的一個或多個,也就是說在其它情況下是不會觸發觸發器的, 包括 SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。
相關內容 一個有趣的應用我們看到許多注冊系統在注冊後都不能更改用戶名,但這多半是由應用程序決定的, 如果直接打開資料庫表進行更改,同樣可以更改其用戶名, 在觸發器中利用回滾就可以巧妙地實現無法更改用戶名……詳細內容 觸發器內部語句出錯時…… 這種情況下,前面對數據更改操作將會無效。舉個例子,在表中插入數據時觸發觸發器,而觸發器內部此時發生了運行時錯誤,那麼將返回一個錯誤值,並且拒絕剛才的數據插入。不能在觸發器中使用的語句 觸發器中可以使用大多數 T-SQL 語句,但如下一些語句是不能在觸發器中使用的。
CREATE 語句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
ALTER 語句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
DROP 語句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
DISK 語句,如:DISK INIT、DISK RESIZE。
LOAD 語句,如:LOAD DATABASE、LOAD LOG。
RESTORE 語句,如:RESTORE DATABASE、RESTORE LOG。
RECONFIGURE TRUNCATE TABLE 語句在sybase的觸發器中不可使用!
❹ sql的觸發器怎麼做
這個不能用觸發器,要用作業。
打開企業管理器,進入你伺服器名下的「管理」,啟動SQL Server代理。然後查看伺服器屬性,選中「自動啟動SQL Server代理」。
接下來進入SQL Server代理下的「作業」,在右邊點右鍵選「新建作業」。
在「常規」里,隨便輸入一個作業名,分類要選最後一項「資料庫維護」。
在「步驟」里,點「新建步驟」,隨便輸入一個步驟名,資料庫選成你的資料庫,命令里輸入你刪除記錄的語句,也可以通過「打開」來裝載T-SQL腳本,弄好後記得分析一下,沒有問題再繼續。在「高級」里將「失敗時的操作」改成「轉到下一步」。
在「調度」里,點「新建調度」,隨便輸入一個調度名,點「更改」,「發生頻率」選每天,「一次發生於」里設置17:00:00,然後點「確定」,再點「確定」,再點「確定」,配置就完成了。
❺ SQL觸發器怎麼用
在SQL中,觸發器是一種特殊類型的存儲過程,它不同於SQL的存儲過程。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。當對某一表進行諸如UPDATE、 INSERT、 DELETE 這些操作時,SQL Server 就會自動執行觸發器所定義的SQL 語句,從而確保對數據的處理必須符合由這些SQL 語句所定義的規則。
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。除此之外,觸發器還有其它許多不同的功能:
(1)強化約束(Enforce restriction)
觸發器能夠實現比CHECK 語句更為復雜的約束。
(2)跟蹤變化(Auditing changes)
觸發器可以偵測資料庫內的操作,從而不允許資料庫中未經許可的指定更新和變化。
(3)級聯運行(Cascaded operation)。
觸發器可以偵測資料庫內的操作,並自動地級聯影響整個資料庫的各項內容。例如,某個表上的觸發器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發器被觸發。
(4)存儲過程的調用(Stored procere invocation)。
為了響應資料庫更新觸,發器可以調用一個或多個存儲過程,甚至可以通過外部過程的調用而在DBMS( 資料庫管理系統)本身之外進行操作。
由此可見,觸發器可以解決高級形式的業務規則或復雜行為限制以及實現定製記錄等一些方面的問題。例如,觸發器能夠找出某一表在數據修改前後狀態發生的差異,並根據這種差異執行一定的處理。此外一個表的同一類型(INSERT、 UPDATE、 DELETE)的多個觸發器能夠對同一種數據操作採取多種不同的處理。
總體而言,觸發器性能通常比較低。當運行觸發器時,系統處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內存中也不在資料庫設備上,而刪除表和插入表總是位於內存中。可見觸發器所參照的其它表的位置決定了操作要花費的時間長短。
觸發器的種類
SQL Server 2000 支持兩種類型的觸發器:AFTER 觸發器和INSTEAD OF 觸發器。其中AFTER 觸發器即為SQL Server 2000 版本以前所介紹的觸發器。該類型觸發器要求只有執行某一操作(INSERT UPDATE DELETE) 之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於AFTER 觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最後觸發,通常使用系統過程sp_settriggerorder 來完成此任務。
INSTEAD OF 觸發器表示並不執行其所定義的操作(INSERT、 UPDATE、 DELETE),而僅是執行觸發器本身。既可在表上定義INSTEAD OF 觸發器,也可以在視圖上定義INSTEAD OF 觸發器,但對同一操作只能定義一個INSTEAD OF觸發器。
❻ 請教如何使用SQL的觸發器 資料庫是MSSQLSERVER
當觸發INSERT觸發器時,新的數據行就會被插入到觸發器表和inserted表中。inserted表是一個邏輯表,它包含了已經插入的數據行的一個副本。inserted表包含了INSERT語句中已記錄的插入動作。inserted表還允許引用由初始化INSERT語句而產生的日誌數據。觸發器通過檢查inserted表來確定是否執行觸發器動作或如何執行它。inserted表中的行總是觸發器表中一行或多行的副本。
日誌記錄了所有修改數據的動作(INSERT、UPDATE和DELETE語句),但在事務日誌中的信息是不可讀的。然而,inserted表允許你引用由INSERT語句引起的日誌變化,這樣就可以將插入數據與發生的變化進行比較,來驗證它們或採取進一步的動作。也可以直接引用插入的數據,而不必將它們存儲到變數中。
示例
在本例中,將創建一個觸發器。無論何時訂購產品(無論何時向Order Details表中插入一條記錄),這個觸發器都將更新Procts表中的一列(UnitsInStock)。用原來的值減去訂購的數量值即為新值。
===========================================================
USE Northwind
CREATE TRIGGER OrdDet_Insert
ON [Order Details]
FOR INSERT
AS
UPDATE P SET
UnitsInStock = P.UnitsInStock – I.Quantity
FROM Procts AS P INNER JOIN Inserted AS I
ON P.ProctID = I.ProctID
===========================================================
DELETE觸發器的工作過程
當觸發DELETE觸發器後,從受影響的表中刪除的行將被放置到一個特殊的deleted表中。deleted表是一個邏輯表,它保留已被刪除數據行的一個副本。deleted表還允許引用由初始化DELETE語句產生的日誌數據。
使用DELETE觸發器時,需要考慮以下的事項和原則:
·當某行被添加到deleted表中時,它就不再存在於資料庫表中;因此,deleted表和資料庫表沒有相同的行。
·創建deleted表時,空間是從內存中分配的。deleted表總是被存儲在高速緩存中。
·為DELETE動作定義的觸發器並不執行TRUNCATE TABLE語句,原因在於日誌不記錄TRUNCATE TABLE語句。
示例
在本例中,將創建一個觸發器,無論何時刪除一個產品類別(即從Categories表中刪除一條記錄),該觸發器都會更新Procts表中的Discontinued列。所有受影響的產品都標記為1,標示不再使用這些產品了。
===========================================================
USE Northwind
CREATE TRIGGER Category_Delete
ON Categories
FOR DELETE
AS
UPDATE P SET Discontinued = 1
FROM Procts AS P INNER JOIN deleted AS d
ON P.CategoryID = d.CategoryID
===========================================================
UPDATE觸發器的工作過程
可將UPDATE語句看成兩步操作:即捕獲數據前像(before image)的DELETE語句,和捕獲數據後像(after image)的INSERT語句。當在定義有觸發器的表上執行UPDATE語句時,原始行(前像)被移入到deleted表,更新行(後像)被移入到inserted表。
觸發器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執行觸發器動作。
可以使用IF UPDATE語句定義一個監視指定列的數據更新的觸發器。這樣,就可以讓觸發器容易的隔離出特定列的活動。當它檢測到指定列已經更新時,觸發器就會進一步執行適當的動作,例如發出錯誤信息指出該列不能更新,或者根據新的更新的列值執行一系列的動作語句。
語法
===========================================================
IF UPDATE (<column_name>)
===========================================================
例1
本例阻止用戶修改Employees表中的EmployeeID列。 www.aspxuexi.com
===========================================================
USE Northwind
GO
CREATE TRIGGER Employee_Update
ON Employees
FOR UPDATE
AS
IF UPDATE (EmployeeID)
BEGIN
RAISERROR ('Transaction cannot be processed.\
***** Employee ID number cannot be modified.', 10, 1)
ROLLBACK TRANSACTION
END
===========================================================
INSTEAD OF觸發器的工作過程
可以在表或視圖上指定INSTEAD OF觸發器。執行這種觸發器就能夠替代原始的觸發動作。INSTEAD OF觸發器擴展了視圖更新的類型。對於每一種觸發動作(INSERT、UPDATE或 DELETE),每一個表或視圖只能有一個INSTEAD OF觸發器。
INSTEAD OF觸發器被用於更新那些沒有辦法通過正常方式更新的視圖。例如,通常不能在一個基於連接的視圖上進行DELETE操作。然而,可以編寫一個INSTEAD OF DELETE觸發器來實現刪除。上述觸發器可以訪問那些如果視圖是一個真正的表時已經被刪除的數據行。將被刪除的行存儲在一個名為deleted的工作表中,就像AFTER觸發器一樣。相似地,在UPDATE INSTEAD OF觸發器或者INSERT INSTEAD OF觸發器中,你可以訪問inserted表中的新行。
不能在帶有WITH CHECK OPTION定義的視圖中創建INSTEAD OF觸發器。
示例
在本例中,創建了一個德國客戶表和一個墨西哥客戶表。放置在視圖上的INSTEAD OF觸發器將把更新操作重新定向到適當的基表上。這時發生的插入是對CustomersGer表的插入而不是對視圖的插入。 www.aspxuexi.com
創建兩個包含客戶數據的表:
===========================================================
SELECT * INTO CustomersGer FROM Customers WHERE Customers.Country = 'Germany'
SELECT * INTO CustomersMex FROM Customers WHERE Customers.Country = 'Mexico'
GO
===========================================================
在該數據上創建視圖:
===========================================================
CREATE VIEW CustomersView AS
SELECT * FROM CustomersGer
UNION
SELECT * FROM CustomersMex
GO
===========================================================
創建一個在上述視圖上的INSTEAD OF觸發器:
===========================================================
CREATE TRIGGER Customers_Update2
ON CustomersView
INSTEAD OF UPDATE AS
DECLARE @Country nvarchar(15)
SET @Country = (SELECT Country FROM Inserted)
IF @Country = 'Germany'
BEGIN
UPDATE CustomersGer
SET CustomersGer.Phone = Inserted.Phone
FROM CustomersGer JOIN Inserted
ON CustomersGer.CustomerID = Inserted.CustomerID
END
ELSE
IF @Country = 'Mexico'
BEGIN
UPDATE CustomersMex
SET CustomersMex.Phone = Inserted.Phone
FROM CustomersMex JOIN Inserted
ON CustomersMex.CustomerID = Inserted.CustomerID
END
===========================================================
通過更新視圖,測試觸發器:
===========================================================
UPDATE CustomersView SET Phone = ' 030-007xxxx'
WHERE CustomerID = 'ALFKI'
SELECT CustomerID, Phone FROM CustomersView
WHERE CustomerID = 'ALFKI'
SELECT CustomerID, Phone FROM CustomersGer www.aspxuexi.com
WHERE CustomerID = 'ALFKI'
===========================================================
那麼具體的講,對於多列數據,如何計算方差呢?:
===========================================================
CREATE TRIGGER [calT1T2T3] ON dbo.DCLB
FOR INSERT,UPDATE
AS
update P
SET
/**//*
計算方差的觸發器
*/
P.T1=(I.P1+I.P2+I.P3+I.P4+I.P5+I.P6),
P.T2=(I.Y1+I.Y2+I.Y3+I.Y4+I.Y5+I.Y6 ), www.aspxuexi.com
P.T3=SQRT(P.T1*P.T1+P.T2*P.T2)
FROM DCLB AS P INNER JOIN Inserted AS I
ON P.SID = I.SID
===========================================================
觸發器的使用很方便,而且也很簡單,重要的是理解inserted過程。可將UPDATE語句看成兩步操作:即捕獲數據前像(before image)的DELETE語句,和捕獲數據後像(after image)的INSERT語句。當在定義有觸發器的表上執行UPDATE語句時,原始行(前像)被移入到deleted表,更新行(後像)被移入到inserted表。觸發器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執行觸發器動作。
❼ SQL觸發器如何使用
CREATE TRIGGER
創建觸發器,觸發器是一種特殊的存儲過程,在用戶試圖對指定的表執行指定的數據修改語句時自動執行。Microsoft® SQL Server™ 允許為任何給定的 INSERT、UPDATE 或 DELETE 語句創建多個觸發器。
語法
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
參數
trigger_name
是觸發器的名稱。觸發器名稱必須符合標識符規則,並且在資料庫中必須唯一。可以選擇是否指定觸發器所有者名稱。
Table | view
是在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。可以選擇是否指定表或視圖的所有者名稱。
WITH ENCRYPTION
加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發器作為 SQL Server 復制的一部分發布。
AFTER
指定觸發器只有在觸發 SQL 語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器。
如果僅指定 FOR 關鍵字,則 AFTER 是默認設置。
不能在視圖上定義 AFTER 觸發器。
INSTEAD OF
指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。
在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發器。然而,可以在每個具有 INSTEAD OF 觸發器的視圖上定義視圖。
INSTEAD OF 觸發器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項的可更新視圖添加 INSTEAD OF 觸發器,SQL Server 將產生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項後才能定義 INSTEAD OF 觸發器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
是指定在表或視圖上執行哪些數據修改語句時將激活觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項。
對於 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關系的表上使用 UPDATE 選項。
WITH APPEND
指定應該添加現有類型的其它觸發器。只有當兼容級別是 65 或更低時,才需要使用該可選子句。如果兼容級別是 70 或更高,則不必使用 WITH APPEND 子句添加現有類型的其它觸發器(這是兼容級別設置為 70 或更高的 CREATE TRIGGER 的默認行為)。有關更多信息,請參見 sp_dbcmptlevel。
WITH APPEND 不能與 INSTEAD OF 觸發器一起使用,或者,如果顯式聲明 AFTER 觸發器,也不能使用該子句。只有當出於向後兼容而指定 FOR 時(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以後的版本將不支持 WITH APPEND 和 FOR(將被解釋為 AFTER)。
NOT FOR REPLICATION
表示當復制進程更改觸發器所涉及的表時,不應執行該觸發器。
AS
是觸發器要執行的操作。
sql_statement
是觸發器的條件和操作。觸發器條件指定其它准則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執行觸發器操作。
當嘗試 DELETE、INSERT 或 UPDATE 操作時,Transact-SQL語句中指定的觸發器操作將生效。
觸發器可以包含任意數量和種類的 Transact-SQL 語句。觸發器旨在根據數據修改語句檢查或更改數據;它不應將數據返回給用戶。觸發器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個特殊的表:
deleted 和 inserted 是邏輯(概念)表。這些表在結構上類似於定義觸發器的表(也就是在其中嘗試用戶操作的表);這些表用於保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用:
SELECT *
FROM deleted
如果兼容級別等於 70,那麼在 DELETE、INSERT 或 UPDATE 觸發器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發器中檢索新值,請將 inserted 表與原始更新表聯接。當兼容級別是 65 或更低時,對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長度字元串。
當兼容級別是 80 或更高時,SQL Server 允許在表或視圖上通過 INSTEAD OF 觸發器更新 text、ntext 或 image 列。
n
是表示觸發器中可以包含多條 Transact-SQL 語句的佔位符。對於 IF UPDATE (column) 語句,可以通過重復 UPDATE (column) 子句包含多列。
IF UPDATE (column)
測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用於 DELETE 操作。可以指定多列。因為在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個列上進行的 INSERT 或 UPDATE 操作,請在第一個操作後指定單獨的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。
說明 IF UPDATE (column) 子句的功能等同於 IF、IF...ELSE 或 WHILE 語句,並且可以使用 BEGIN...END 語句塊。有關更多信息,請參見控制流語言。
可以在觸發器主體中的任意位置使用 UPDATE (column)。
column
是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數據類型。但是,計算列不能用於該環境中。有關更多信息,請參見數據類型。
<br
❽ MSSQL觸發器如何使用
use
database
name
Alter
Table
t
Disable
Trigger
ALL
(關閉觸發器)
insert
into
t
select
*
From
t2
(各類操作語句)
/*
delete
t
where......
*/
/*
update
t
set...
where...*/
Alter
Table
t
Enable
Trigger
ALL
(打開觸發器)
以上是在插入、更改、刪除數據之前把針對表T的觸發器關閉,操作表T的時候就不會再受觸發器的干擾了,等這些操作完成後再把觸發器打開。但是關閉觸發器之前,得考慮周全,確定後面的操作不會對數據產生影響.
因為觸發器能維持表之間的數據完整性和一致性,它的作用很重要.
❾ 如何在代碼中實現SQL觸發器的功能
先給你舉個觸發器的實例:
先創建兩個表
Create Table Student( --學生表
StudentID int primary key, --學號
....
)
Create Table BorrowRecord( --學生借書記錄表
BorrowRecord int identity(1,1), --流水號
StudentID int , --學號
BorrowDate datetime, --借出時間
ReturnDAte Datetime, --歸還時間
...
)
創建觸發器
Create Trigger truStudent
On Student --在Student表中創建觸發器
for Update --為什麼事件觸發,在這里就是修改的時候會執行這個觸發器,一旦你修改Student表,就會執行
As --事件觸發後所要做的事情
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted臨時表
Where br.StudentID=d.StudentID
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行;
可見,表級觸發器在更新了多行的情況下,只觸發了一次;