⑴ sql server 2005觸發器
我這里有個 縮水版本的。列數少幾列的, 功能上都沒問題。
CREATE TABLE score (
id INT PRIMARY KEY,
val VARCHAR(10)
);
CREATE TRIGGER tr_Update_score
ON score
instead of update
AS
BEGIN
IF USER_NAME() = 'dbo'
UPDATE
score
SET
score.val = inserted.val
FROM
score JOIN inserted
ON (score.id = inserted.id)
ELSE
PRINT '你不是 DBO!';
END;
insert into score VALUES(1, 'A');
-- 使用 Demo 作為用戶名,登錄到資料庫。
E:\>sqlcmd -S "localhost\SQLEXPRESS" -U Demo -P demo
1> use testwork
2> go
已將資料庫上下文更改為 'TestWork'。
1> UPDATE score SET val='B' WHERE id = 1;
2> go
(1 行受影響)
你不是 DBO!
1> select * FROM score;
2> go
id val
----------- ----------
1 A
(1 行受影響)
-- 使用操作系統驗證,登錄到資料庫。
E:\>sqlcmd -S "localhost\SQLEXPRESS"
1> use testwork
2> go
已將資料庫上下文更改為 'TestWork'。
1> UPDATE score SET val='B' WHERE id = 1;
2> go
(1 行受影響)
1> select * FROM score;
2> go
id val
----------- ----------
1 B
(1 行受影響)
======================
--貨物表
CREATE TABLE stock(
id INT,
stock_amount INT
);
--訂單表
CREATE TABLE sell(
ID INT,
GoodsID INT,
sell_amount INT
);
-- 庫存測試數據:
INSERT INTO stock VALUES (1, 100);
create trigger trgAfterSell
on sell
after insert
as
begin
declare
@cGoodsID as int,
@sell_amount as int,
@nowCount as INT
select @cGoodsID = GoodsID, @sell_amount = sell_amount
from inserted
SELECT @nowCount = stock_amount
FROM stock
where ID = @cGoodsID;
IF @nowCount - @sell_amount < 0
BEGIN
PRINT '庫存量不足,只有 ' + CAST(@nowCount AS varchar);
ROLLBACK;
END
ELSE
BEGIN
update stock
set stock_amount = stock_amount - @sell_amount
where ID = @cGoodsID
PRINT '庫存量還剩餘' + CAST ((@nowCount - @sell_amount) AS varchar);
END
end
1> INSERT INTO sell VALUES(1, 1, 90);
2> go
(1 行受影響)
庫存量還剩餘10
1> INSERT INTO sell VALUES(1, 1, 20);
2> go
庫存量不足,只有 10
消息 3609,級別 16,狀態 1,伺服器 HOME-BED592453C\SQLEXPRESS,第 1 行
事務在觸發器中結束。批處理已中止。
1> select * from sell;
2> select * from stock;
3> go
ID GoodsID sell_amount
----------- ----------- -----------
1 1 90
(1 行受影響)
id stock_amount
----------- ------------
1 10
(1 行受影響)
⑵ SQL2005觸發器實現如下功能
if (object_id('tgr', 'TR') is not null)
drop trigger tgr
go
create trigger tgr
on classes
for update
as
declare @a int
declare @id int
select @a=a ,@id=id from deleted
if (@a=0 && @a<3)
begin
update text set a=a+1 where id=@id
@a++;
end
go
⑶ sql server 2005新建觸發器
你刷新一下就看到了
⑷ sql server 2005求寫一個觸發器
簡單的做法的
CREATE TRIGGER insertTrigger ON TestA
AFTER INSERT
AS
BEGIN
INSERT INTO TestB SELECT * FROM TestA
DELETE FROM TestA
END
⑸ sql 2005 中如何創建一個觸發器
create trigger B
on a --在表a建立觸發器
for insert ,update ,delete -- insert 插入之後,update 修改之後,delete 刪除之後
as
... --輸入你具體要操作的sql 語句
create trigger B
on a --在表a建立觸發器
Instead of insert ,update ,delete -- insert 插入之前,update 修改之前,delete 刪除之前
as
... --輸入你具體要操作的sql 語句
⑹ sql server 2005觸發器的實現跟作用
去看看sql的幫助吧,下面只是引用了一部分。
創建 DML、DDL 或登錄觸發器。觸發器是資料庫伺服器中發生事件時自動執行的特種存儲過程。如果用戶要通過數據操作語言 (DML) 事件編輯數據,則執行 DML 觸發器。DML 事件是針對表或視圖的 INSERT、UPDATE 或 DELETE 語句。
注意:
在激發任何有效的事件時,將會激發這些觸發器,而無論是否會影響任何錶行。
DDL 觸發器用於響應各種數據定義語言 (DDL) 事件。這些事件主要對應於 Transact-SQL CREATE、ALTER 和 DROP 語句,以及執行類似 DDL 操作的某些系統存儲過程。登錄觸發器在遇到 LOGON 事件時觸發。LOGON 事件是在建立用戶會話時引發的。觸發器可以由 Transact-SQL 語句直接創建,也可以由程序集方法創建,這些方法是在 Microsoft .NET Framework 公共語言運行時 (CLR) 中創建並上載到 SQL Server 實例的。SQL Server 允許為任何特定語句創建多個觸發器。
安全說明:
觸發器內部的惡意代碼可以在升級後的許可權下運行。有關如何減少這種隱患的詳細信息,請參閱管理觸發器安全性。
⑺ sql觸發器實例
觸發器要在條件下才觸發的,你這個觸發器需要在table1表做更新操作時才觸發,而且update table1 set @save_flg='1' 這句話錯了,@save_flg是變數而非table1的欄位,所以也不會修改
⑻ SQL2005的觸發器怎麼使用
資料庫領域名詞
簡介
觸發器可以查詢其他表,而且可以包含復雜的 SQL 語句。它們主要用於強制服從復雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。 觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用資料庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。
創建觸發器的SQL語法
DELIMITER | CREATE TRIGGER `<databaseName>`.`<triggerName>` < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] > ON <tableName> FOR EACH ROW BEGIN --do something END |
觸發器的優點
觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用 CHECK 約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的對策以響應同一個修改語句。
比較觸發器與約束
約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用 Transact-SQL 代碼的復雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。實體完整性總應在最低級別上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過 CHECK 約束進行強制,而引用完整性 (RI) 則應通過 FOREIGN KEY 約束進行強制。在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。 例如:除非 REFERENCES 子句定義了級聯引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值完全匹配的值來驗證列值。 CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。 約束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為復雜的錯誤處理,則必須使用觸發器。 觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。 觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在 titleauthor.title_id 上創建一個插入觸發器,使它在新值與 titles.title_id 中的某個值不匹配時回滾一個插入。不過,通常使用 FOREIGN KEY 來達到這個目的。 如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。 觸發器到底可不可以在視圖上創建 在 SQL Server™ 聯機叢書中,是沒有說觸發器不能在視圖上創建的, 並且在語法解釋中表明: 在 CREATE TRIGGER 的 ON 之後可以是視圖。 然而,事實似乎並不是如此,很多專家也說觸發器不能在視圖上創建。我也專門作了測試,的確如此,不管是普通視圖還是索引視圖,都無法在上面創建觸發器,真的是這樣嗎?請點擊詳細,但是無可厚非的是:當在臨時表或系統表上創建觸發器時會遭到拒絕。 深刻理解 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 server創建觸發器實例
你還是在修改前進行檢查吧,否則,一旦觸發器檢測到已有借閱記錄,則必須重新發起一個update動作去更新到原先狀態,然後繼續觸發觸發器,然後,就死循環了。
⑽ sql資料庫觸發器實例
sqlserver觸發器觸是對表進行插入、更新、刪除的時候會自動執行的特殊存儲過程。並且在SQLSERVER中也沒法調用JAVA程序,你可以在JAVA段寫一個輪詢,每隔多少秒去查看這張表,如果有表有更新,就調用你需要的JAVA程序。
關於觸發器使用實例,你可以參考這個鏈接:http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html