數據庫觸發器操作

JY數據庫觸發器操作

USE JY
GO

1.說明:

  1. 作用:實現主鍵和外鍵所不能保證的複雜參照完整性和數據一致性

  2. 結果:
    觸發器和引起觸發器執行的語句會被當做一次事務處理,如果執行失敗,
    自動回滾至事務執行前的狀態

  3. 功能:

    1.強化約束:能實現比check更復雜的約束,強制執行數據庫中相關表的完整性
    2.跟蹤數據變化:撤銷或者回滾違反了引用完整性的操作,防止非法修改數據
    3.級聯運行:級聯修改數據庫中相關的表,自動觸發與之相關的操作
    4.返回自定義錯誤信息:可以返回信息,約束只能顯示系統的標準錯誤信息

  4. 注意:

    1.CREATE TRIGGER必須是批處理的第一條語句,且只能應用到一個表中
    2.與存儲過程一樣,當觸發器觸發時,需要向調用應用程序返回結果;若不需要返回結果,則不能在觸發器中對變量賦值
    3.在同一條CREATE TRIGGER語句中,可以爲多個事件定義相同的觸發器操作
    4.觸發器只能在當前數據庫中創建,但可以引用當前數據庫的外部對象
    5.如果一個表的外鍵在DELETE/UPDATE上定義了級聯,則不能在該表上定義INSTEAD OF UPDATE/DELETE觸發器
    6.約束可以實現預定數據完整性時,優先使用約束
    7.觸發器不允許使用ALTER DATABASE、CREATE DATABASE和DROP DATABASE等語句
    8.允許嵌套和遞歸

2.創建AFTER觸發器

  • 語法格式
CREATE TRIGGER trigger_name
ON {table | view}
[WITH <ENCRPYPTION>]
{
    {FOR | AFTER | INSTEAD OF}
    {[DELETE] [,] [INSERT] [,] [UPDATE]}
    AS
        sql_statement[ , ...]  --觸發器條件和操作
}
  • 注意:

    1.AFTER是在完成所有的約束檢查後執行
    2.INSTEAD OF可以解決外鍵約束問題,但不能解決是否爲空、數據類型或標識列問題
    在執行約束前執行

  • 示例1:

CREATE TRIGGER tg_updatereader
ON reader
AFTER UPDATE
AS
    BEGIN
        PRINT '已修改讀者表reader的數據'
        SELECT reader_name AS '更新前' FROM DELETED
        SELECT reader_name AS '更新後' FROM INSERTED
    END
GO

UPDATE reader
SET reader_name = '哈哈晨'
WHERE reader_id = 'r0004'
GO
  • 示例2:
CREATE TRIGGER tg_insertreader
ON reader
AFTER INSERT
AS
    BEGIN
        RAISERROR('不允許插入,操作已禁止', 1, 1)
        ROLLBACK TRANSACTION
    END
GO

INSERT INTO reader
VALUES ('r0010', '李佳佳', '女', '涉外教育系')
GO
  • 示例3:
CREATE TRIGGER tg_deletereader
ON reader
AFTER DELETE
AS
    SELECT reader_id AS '已刪除用戶編號'
    FROM DELETE
GO

DELETE FROM reader
WHERE reader_id = 'r0009'
GO
  • 示例4:
--進行插入、刪除、更新record表時級聯更新借閱記錄
CREATE TRIGGER setview
ON record
FOR INSERT, UPDATE, DELETE
AS
    UPDATE book SET interview_times = interview_times + 1
        WHERE book_id = (SELECT book_id FROM INSERTED)
    UPDATE book SET interview_times = interview_times - 1
        WHERE book_id = (SELECT book_id FROM DELETED)
    PRINT '已自動更新book表中相應圖書借閱次數'
GO

3.創建INSTEAD OF觸發器

CREATE TRIGGER intg_updatereader
ON reader
INSTEAD OF UPDATE
AS
    PRINT '實際上並沒有修改數據'
GO

UPDATE reader SET reader_name = '哈哈晨'
WHERE reader_id = 'r0004'
GO

4.管理觸發器

  • 修改觸發器
ALTER TRIGGER tg_updatereader
ON reader
AFTER UPDATE
AS
    IF((SELECT count(*) FROM INSERTED) <> 0)
        PRINT '已修改reader表的數據'
    ELSE
        PRINT '不存在要更改的數據'
GO

UPDATE reader SET reader_name = 'Michael'
WHERE reader_id = 'r0012'
GO
  • 刪除觸發器
DROP TRIGGER trigger_name[ , ...]
  • 啓用和禁用觸發器
--禁用
ALTER TABLE reader
DISABLE TRIGGER tg_updatereader
--DISABLE TRIGGER tg_updatereader ON reader

--啓用
ALTER TABLE reader
ENABLE TRIGGER tg_updatereader
--ENABLE TRIGGER tg_updatereader ON reader
  • 查看觸發器
SELECT *
FROM sysobjects WHERE TYPE = 'TR'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章