當前位置:首頁 » 操作系統 » 資料庫觸發器實驗

資料庫觸發器實驗

發布時間: 2022-02-23 05:04:53

1. 資料庫中的「觸發器」是什麼意思

sql中,名詞觸發器指「在資料庫中為響應一個特殊表格中的某些事件而自動執行的程序代碼。」(Wikipedia)說得簡單一些,它是在一個特殊的資料庫事件,如INSERT或DELETE發生時,自動激活的一段代碼。觸發器可方便地用於日誌記錄、對單個表格到其他鏈接式表格進行自動的「層疊式」更改、或保證對表格關系進行自動更新。當一個新整數值增加到資料庫域中時,自動更新運行的總數的代碼段是一個觸發器。自動記錄對一個特殊資料庫表格所作更改的SQL命令塊也是一個觸發器實例

2. 資料庫觸發器的優缺點以及用法

觸發器本質上講就是事件監控器,可以定義在資料庫系統進行某一個操作的前後。
當資料庫系統在進行特定的操作時,發現有觸發器定義,就去執行觸發器定義的功能,從而滿足某些特定的需要。
例如,在更新某些數據後,再去更新特定的數據。
這就可以定義一個觸發器完成這樣的需要。

觸發器的優點:
以事件方式來處理. 當數據發生變化的時候, 自動作處理。
缺點:
當資料庫之間 導出導入的時候, 可能會引起不必要的觸發邏輯。

3. 資料庫觸發器是什麼

觸發器是一類特殊的存儲過程,被定義為在對表或視圖發出 UPDATE、INSERT 或 DELETE 語句時自動執行。觸發器是功能強大的工具,使每個站點可以在有數據修改時自動強制執行其業務規則。觸發器可以擴展 SQL Server 約束、默認值和規則的完整性檢查邏輯,但只要約束和默認值提供了全部所需的功能,就應使用約束和默認值。

表可以有多個觸發器。CREATE TRIGGER 語句可以與 FOR UPDATE、FOR INSERT 或 FOR DELETE 子句一起使用,指定觸發器專門用於特定類型的數據修改操作。當指定 FOR UPDATE 時,可以使用 IF UPDATE (column_name) 子句,指定觸發器專門用於具體某列的更新。

代碼是寫在資料庫裡面的,觸發器包含 Transact-SQL 語句,這與存儲過程十分相似。

如果你有安裝SQL SEVER,那麼你可以在SQL SEVER的幫助文檔里找到很多詳細的解析,打開查詢分析器按F1也可以打開SQL SEVER的幫助文檔。

示例
下例首先創建一個觸發器,當用戶在表 roysched 中添加或更改數據時,該觸發器向客戶端列印一條用戶定義消息。然後,使用 ALTER TRIGGER 語句使該觸發器僅對 INSERT 活動有效。該觸發器有助於提醒向表中插入行或更新行的用戶及時通知書的作者和出版商。

USE pubs
GO
CREATE TRIGGER royalty_reminder
ON roysched
WITH ENCRYPTION
FOR INSERT, UPDATE
AS RAISERROR (50009, 16, 10)

-- Now, alter the trigger.
USE pubs
GO
ALTER TRIGGER royalty_reminder
ON roysched
FOR INSERT
AS RAISERROR (50009, 16, 10)

4. 資料庫觸發器有什麼作用

觸發器的作用:

自動計算數據值,如果數據的值達到了一定的要求,則進行特定的處理。

同步實時地復製表中的數據。

實現復雜的非標準的資料庫相關完整性規則。

可在寫入數據表前,強制檢驗或轉換數據。

觸發器發生錯誤時,異動的結果會被撤銷。

部分資料庫管理系統可以針對數據定義語言(DDL)使用觸發器,稱為DDL觸發器。

可依照特定的情況,替換異動的指令 (INSTEAD OF)。


(4)資料庫觸發器實驗擴展閱讀:

分類

SQL Server 包括三種常規類型的觸發器:DML 觸發器、DDL 觸發器和登錄觸發器。

DML觸發器

當資料庫中表中的數據發生變化時,包括insert,update,delete任意操作,如果我們對該表寫了對應的DML觸發器,那麼該觸發器自動執行。

DML觸發器的主要作用在於強制執行業 務規則,以及擴展Sql Server約束,默認值等。因為我們知道約束只能約束同一個表中的數據,而觸發器中則可以執行任意Sql命令。

DDL觸發器

它是Sql Server2005新增的觸發器,主要用於審核與規范對資料庫中表,觸發器,視圖等結構上的操作。比如在修改表,修改列,新增表,新增列等。

它在資料庫結構發生變化時執行,我們主要用它來記錄資料庫的修改過程,以及限製程序員對資料庫的修改,比如不允許刪除某些指定表等。

登錄觸發器

登錄觸發器將為響應 LOGIN 事件而激發存儲過程。與 SQL Server 實例建立用戶會話時將引發此事件。登錄觸發器將在登錄的身份驗證階段完成之後且用戶會話實際建立之前激發。

因此,來自觸發器內部且通常將到達用戶的所有消息(例如錯誤消息和來自 PRINT 語句的消息)會傳送到 SQL Server 錯誤日誌。如果身份驗證失敗,將不激發登錄觸發器。

參考資料來源:網路-觸發器

5. mysql資料庫觸發器,怎麼做滿足條件觸發

建立兩個單域的表格。一個表格中為姓名列表(表格名:data)。
另一個表格中是所插入字元的字元數(表格名:chars)。在data表格中定義一個觸發器。
每次在其中插入一個新姓名時,chars表格中運行的總數就會根據新插入記錄的字元數目進行自動更新。
(見列表A)
mysql> CREATE TABLE data (name VARCHAR(255));
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TABLE chars (count INT(10));
Query OK, 0 rows affected (0.07 sec)
mysql> INSERT INTO chars (count) VALUES (0);
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TRIGGER t1 AFTER INSERT ON
data FOR EACH ROW UPDATE chars SET count = count + CHAR_LENGTH(NEW.name);
Query OK, 0 rows affected (0.01 sec)
列表A
理解上面代碼的關鍵在於CREATE TRIGGER命令,被用來定義一個新觸發器。這個命令建立一個新觸發器,假定的名稱為t1,每次有一個新記錄插入到data表格中時,t1就被激活。
在這個觸發器中有兩個重要的子句:
AFTER INSERT子句表明觸發器在新記錄插入data表格後激活。
UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)子句表示觸發器激活後執行的SQL命令。在本例中,該命令表明用新插入的data.name域的字元數來更新 chars.count欄。這一信息可通過內置的MySQL函數CHAR_LENGTH()獲得。
放在源表格域名前面的NEW關鍵字也值得注意。這個關鍵字表明觸發器應考慮域的new值(也就是說,剛被插入到域中的值)。MySQL還支持相應的OLD前綴,可用它來指域以前的值。
可以通過調用SHOW TRIGGER命令來檢查觸發器是否被激活,如列表B所示。
mysql> SHOW TRIGGERS\G
*************************** 1. row ***************************
?Trigger: t1
?Event: INSERT
?Table: data
Statement: UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)
Timing: AFTER
?Created: NULL
ql_mode:
1 row in set (0.01 sec)
列表B
激活觸發器後,開始對它進行測試。試著在data表格中插入幾個記錄:
mysql> INSERT INTO data (name) VALUES ('Sue'), ('Jane');
Query OK, 2 rows affected (0.00 sec)
Records: 2?Duplicates: 0?Warnings: 0
然後檢查chars表格看觸發器是否完成它該完成的任務:
mysql> SELECT * FROM chars;
+-------+
| count |
+-------+
| 7|
+-------+
1 row in set (0.00 sec)
data表格中的INSERT命令激活觸發器,計算插入記錄的字元數,並將結果存儲在chars表格中。如果往data表格中增加另外的記錄,chars.count值也會相應增加。
觸發器應用完畢後,可有DROP TRIGGER命令輕松刪除它。
mysql> DROP TRIGGER t1;
Query OK, 0 rows affected (0.00 sec)
注意:理想情況下,你還需要一個倒轉觸發器,每當一個記錄從源表格中刪除時,它從字元總數中減去記錄的字元數。這很容易做到,你可以把它當作練習來完成。提示:應用BEFORE DELETE ON子句是其中一種方法。
現在,要建立一個審計記錄來追蹤對這個表格所做的改變。這個記錄將反映表格的每項改變,並向用戶說明由誰做出改變以及改變的時間。需要建立一個新表格來存儲這一信息(表格名:audit),如下所示。(列表C)
mysql> CREATE TABLE audit (id INT(7), balance FLOAT, user VARCHAR(50)
NOT NULL, time TIMESTAMP NOT NULL);
Query OK, 0 rows affected (0.09 sec)
列表C
接下來,我將在accounts表格中定義一個觸發器。(列表D)
mysql> CREATE TRIGGER t1 AFTER UPDATEON accounts
FOR EACH ROW INSERT INTO audit (id, balance, user, time)
VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW());
Query OK, 0 rows affected (0.04 sec)
列表D
要是已經走到這一步,就很容易理解。accounts表格每經歷一次UPDATE,觸發器插入(INSERT)對應記錄的id、新的余額、當前時間和登錄audit表格的用戶的名稱。
實現中的例子:用觸發器審計記錄
既然了觸發器的基本原理,來看一個稍稍復雜的例子。常用觸發器來建立一個自動「審計記錄」,以記錄各種用戶對資料庫的更改。為了解審計記錄的實際應用,請看下面的表格(表格名:accounts),它列出了一個用戶的三個銀行賬戶余額。(表A)
mysql> SELECT * FROM accounts;
+----+------------+---------+
| id | label| balance |
+----+------------+---------+
|1 | Savings #1 |500 |
|2 | Current #1 |2000 |
|3 | Current #2 |3500 |
+----+------------+---------+
3 rows in set (0.00 sec)
表A
然後,檢查觸發器是否被激活:
mysql> SHOW TRIGGERS \G
*************************** 1. row ***************************
?Trigger: t1
?Event: UPDATE
?Table: accounts
Statement: INSERT INTO audit (id, balance, user, time)
VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW())
Timing: AFTER
?Created: NULL
Sql_mode:
1 row in set (0.01 sec)
再來看最後的結果(列表E):
mysql> UPDATE accounts SET balance = 500 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1?Changed: 1?Warnings: 0
mysql> UPDATE accounts SET balance = 900 WHERE id = 3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1?Changed: 1?Warnings: 0
mysql> UPDATE accounts SET balance = 1900 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1?Changed: 1?Warnings: 0
列表E
注意,對accounts表格所作的改變已被記錄到audit表格中,將來如果出現問題,可以方便地從中進行恢復。
mysql> SELECT * FROM audit;
+------+---------+----------------+---------------------+
| id| balance | user| time|
+------+---------+----------------+---------------------+
|1 |500 | root@localhost | 2006-04-22 12:52:15 |
|3 |900 | root@localhost | 2006-04-22 12:53:15 |
|1 |1900 | root@localhost | 2006-04-22 12:53:23 |
+------+---------+----------------+---------------------+
3 rows in set (0.00 sec)

6. 資料庫實驗四:什麼是觸發器主要功能是什麼

你去Google或者Bai一下遠遠比在這里提問獲得信息多。

7. 如何對SQL資料庫觸發器做單元測試

直接利用oralce的客戶端工具,進行表的數據insert,delete,update操作即可,寫好的觸發器不出錯的話自動會進行處理,查看一下達沒有達到效果就行了

8. sql資料庫觸發器實例

sqlserver觸發器觸是對表進行插入、更新、刪除的時候會自動執行的特殊存儲過程。並且在SQLSERVER中也沒法調用JAVA程序,你可以在JAVA段寫一個輪詢,每隔多少秒去查看這張表,如果有表有更新,就調用你需要的JAVA程序。
關於觸發器使用實例,你可以參考這個鏈接:http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html

9. 在資料庫中觸發器裡面怎麼寫加減乘除運算

庫存量和銷售數量中有個是nchar型吧?
看看那個是用數據轉換函數轉一下就可以

在一般情況下,SQL Server 會自動完成數據類型的轉換,例如,可以直接將字元數據類型或表達式與DATATIME 數據類型或表達式比較當表達式中用了INTEGER、 SMALLINT或TINYINT 時,SQL Server 也可將INTEGER 數據類型或表達式轉換為SMALLINT數據類型或表達式,這稱為隱式轉換。如果不能確定SQL Server 是否能完成隱式轉換或者使用了不能隱式轉換的其它數據類型,就需要使用數據類型轉換函數做顯式轉換了。此類函數有兩個:
・CAST()
CAST() 函數語法如下:
CAST (<expression> AS <data_ type>[ length ])
・CONVERT()
CONVERT() 函數語法如下:
CONVERT (<data_ type>[ length ], <expression> [, style])
提醒: 1、data_type為SQL Server系統定義的數據類型,用戶自定義的數據類型不能在此使用。
2、length用於指定數據的長度,預設值為30。
3、把CHAR或VARCHAR類型轉換為諸如INT或SAMLLINT這樣的INTEGER類型、結果必須是帶正號(+)或負號(-)的數值。
4、TEXT類型到CHAR或VARCHAR類型轉換最多為8000個字元,即CHAR或VARCHAR數據類型是最大長度。
5、IMAGE類型存儲的數據轉換到BINARY或VARBINARY類型,最多為8000個字元。
6、把整數值轉換為MONEY或SMALLMONEY類型,按定義的國家的貨幣單位來處理,如人民幣、美元、英鎊等。
7、BIT類型的轉換把非零值轉換為1,並仍以BIT類型存儲。
8、試圖轉換到不同長度的數據類型,會截短轉換值並在轉換值後顯示「+」,以標識發生了這種截斷。
用CONVERT() 函數的style 選項能以不同的格式顯示日期和時間。style 是將DATATIME 和SMALLDATETIME 數據轉換為字元串時所選用的由SQL Server 系統提供的轉換樣式編號,不同的樣式編號有不同的輸出格式。
例子:
CAST([欄位名] as int)
CONVERT(int,[欄位名])

熱點內容
tc演算法 發布:2024-11-13 09:30:37 瀏覽:964
python2712 發布:2024-11-13 09:30:15 瀏覽:634
smsforandroid 發布:2024-11-13 09:20:22 瀏覽:675
如何查找公司郵件伺服器與埠 發布:2024-11-13 08:55:12 瀏覽:531
pythonrequests文件 發布:2024-11-13 08:52:27 瀏覽:223
速騰安卓大屏什麼牌子好 發布:2024-11-13 08:49:59 瀏覽:664
黑岩上傳 發布:2024-11-13 08:49:18 瀏覽:33
Python高清 發布:2024-11-13 08:41:20 瀏覽:738
阿里雲伺服器很慢 發布:2024-11-13 08:29:27 瀏覽:721
老年公寓項目醫療怎麼配置 發布:2024-11-13 07:58:24 瀏覽:948