sql server 觸發器

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   os   使用   for   sp   

原文:sql server 觸發器

             本文是學習使用觸發器資料的總結,內容來自網路,在文章結尾處會給出相應的連結地址。

            在SQL server 2008 R2中,既支援T-SQL的觸發器,也支援建立CLR觸發器。

          一 觸發器簡介

      1)觸發器分類

  •         登陸觸發器:是指當使用者登入SQL SERVER執行個體建立會話時觸發。
  •         DDL(資料定義語言 (Data Definition Language) Data Definition Language)觸發器:是指當伺服器或資料庫中發生(DDL事件時將啟用。DDL事件即指在表或索引中的create、alter、drop語句也。
  •         DML( 資料操縱語言 Data Manipulation Language)觸發器:是指觸發器在資料庫中發生DML事件時將啟用。DML事件即指在表或視圖中修改資料的insert、update、delete語句

                 2)DML觸發器介紹

  •                 在SQL SERVER 2008中,DML觸發器的實現使用兩個邏輯表DELETED和INSERTED。這兩個表是建立在資料庫伺服器的記憶體中,我們只有唯讀許可權。 DELETED和INSERED表的結構和觸發器所在的資料表的結構是一樣的。當觸發器執行完成後,它們也就會被自動刪除:INSERED表用於存放你在 操件insert、update、delete語句後,更新的記錄。比如你插入一條資料,那麼就會把這條記錄插入到INSERTED表:DELETED表 用於存放你在操作 insert、update、delete語句前,你建立觸發器表中資料庫。觸發器可通過資料庫中的相關表實現級聯更改,可以強制比用CHECK約束定義的約束更為複雜的約束。與 CHECK 條件約束不同,觸發器可以        
  •       引用其它表中的列,例如觸發器可以使用另一個表中的 SELECT 比較插入或更新的資料,以及執行其它操作。觸發器也可以根據資料修改前後的表狀態,再行採取對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的對策以響應同一個修改語句  
  •       與此同時,雖然觸發器功能強大,輕鬆可靠地實現許多複雜的功能,為什麼又要慎用?過多觸發器會造成資料庫及應用程式的維護困難,同時對觸發器過分的依賴,勢必影響資料庫的結構,同時增加了維護的複雜程式。

   二 建立T-SQL觸發器小例子

    

    1)首先,我們來嘗試建立一個觸發器,要求就是在AddTable這個表上建立一個Update觸發器,語句為:

        create trigger mytrigger on AddTable for update

           2)然後就是sql語句的部分了,主要是如果發生update以後,要求觸發器觸發一個什麼操作。這裡的意思就是如果出現update了,觸發器就會觸發輸出:the table was updated!。

                   語句為:create trigger mytrigger on AddTable for update as print ‘the table was updated‘

           3)接下來我們來將AddTable表中的資料執行一個更改的操作,語句為: update AddTable set ****

           4)  執行後,我們會發現,觸發器被觸發,輸出了我們設定好的文本(在下方的訊息框)

           5)那觸發器建立以後呢,它就正式開始工作了,這時候我們需要更改觸發器的話,只需要將開始的create建立變為alter,然後修改邏輯即可:alter trigger mytrigger on AddTable for update

            6)如果我們想查看某一個觸發器的內容,直接運行:exec sp_helptext [觸發器名]

            7)如果我想查詢當前資料庫中有多少觸發器,以方便我進行資料庫維護,只需要運行: select * from sysobjects where xtype=‘TR‘

            8)我們如果需要關閉或者開啟觸發器的話,只需要運行:

        disable trigger [觸發器名] on database --禁用觸發器

        enable trigger [觸發器名] on database --開啟觸發器 

                原文: http://jingyan.baidu.com/article/77b8dc7f2b82416175eab65b.html

           三 CLR 觸發程序

                    MSDN上講的很清楚 http://msdn.microsoft.com/zh-cn/library/vstudio/938d9dz2%28v=vs.100%29.aspx

    •   開啟一個現有的“SQL CLR 資料庫專案”,或者建立一個新項目。 有關更多資訊,請參見如何:為使用 SQL Server 通用語言執行平台整合的資料庫物件建立項目。

    •   在“項目”菜單上選擇“添加新項”。

    •   在“添加新項”對話方塊中,選擇“觸發器”。

    •   鍵入新觸發器的“名稱”。

    •   添加觸發器執行時要啟動並執行代碼。 請參見此過程後面的第一個樣本。

    •   在“方案總管”中開啟“TestScripts”檔案夾,並雙擊 Test.sql 檔案。

    •      將代碼添加到 Test.sql 檔案中以執行觸發器。

    •     按 F5 產生、部署並調試此觸發器。 有關如何不進行調試而直接部署的資訊,請參見如何:將 SQL CLR 資料庫專案項部署到 SQL Server。

    •     查看所示的結果“輸出”視窗和選擇顯示輸出: 資料庫輸出。

             注意:SQL Server 2005 和 SQL Server 2008 只支援使用 .NET Framework 2.0、3.0 或 3.5 版產生的 SQL Server 項目。 如果您嘗試部署SQL Server項目,SQL Server 2005或SQL Server 2008,將顯示錯誤訊息: Deploy error (SQL01268): .NET SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 CREATE ASSEMBLY for assembly ‘AssemblyName‘ failed because assembly ‘AssemblyName‘ failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database(在進行校正是您要部署的程式集的名稱)。 有關更多資訊,請參見如何:為使用 SQL Server 通用語言執行平台整合的資料庫物件建立項目。

             1)CLR觸發器代碼

    此樣本示範以下這種情況:使用者選擇他們需要的任何使用者名稱,但是您希望知道哪些使用者輸入了電子郵件地址作為使用者名稱。 此觸發器檢測該資訊並將它記錄到審核表。

      using System.Data.SqlClient;      using System.Text.RegularExpressions;      using Microsoft.SqlServer.Server;      public partial class Triggers      {          [SqlTrigger(Name="UserNameAudit", Target="Users", Event="FOR INSERT")]          public static void UserNameAudit()          {              SqlTriggerContext triggContext = SqlContext.TriggerContext;              SqlParameter userName = new SqlParameter("@username", System.Data.SqlDbType.NVarChar);              if (triggContext.TriggerAction == TriggerAction.Insert)              {                  using (SqlConnection conn = new SqlConnection("context connection=true"))                   {                      conn.Open();                      SqlCommand sqlComm = new SqlCommand();                      SqlPipe sqlP = SqlContext.Pipe;                      sqlComm.Connection = conn;                      sqlComm.CommandText = "SELECT UserName from INSERTED";                      userName.Value = sqlComm.ExecuteScalar().ToString();                      if (IsEMailAddress(userName.ToString()))                      {                          sqlComm.CommandText = "INSERT UsersAudit(UserName) VALUES(userName)";                          sqlP.Send(sqlComm.CommandText);                          sqlP.ExecuteAndSend(sqlComm);                      }                  }              }        }        public static bool IsEMailAddress(string s)        {            return Regex.IsMatch(s, "^([\\w-]+\\.)*?[\\w-][email protected][\\w-]+\\.([\\w-]+\\.)*?[\\w]+$");       }    }

              2)測試指令碼

                   向位於項目的 TestScripts 檔案夾中的 Test.sql 檔案添加代碼以執行和測試觸發器。 例如,如果已部署了觸發器,您可以通過運行指令碼對其進行測試,該指令碼向設定了此觸發器的表中插入新行,從而可激發此觸發器。

              以下調試代碼假定存在具有以下定義的兩個表:

           CREATE TABLE Users                   (                        UserName    NVARCHAR(200)    NOT NULL,                        Pass    NVARCHAR(200)    NOT NULL                   )                   CREATE TABLE UsersAudit                     (                        UserName    NVARCHAR(200)    NOT NULL                     )
測試指令碼:
                -- Insert one user name that is not an e-mail address and one that is                 INSERT INTO Users(UserName, Pass) VALUES(N‘someone‘, N‘cnffjbeq‘)                 INSERT INTO Users(UserName, Pass) VALUES(N‘[email protected]‘, N‘cnffjbeq‘)                  -- check the Users and UsersAudit tables to see the results of the trigger                 select * from Users                 select * from UsersAudit

如果在sqlserver 中執行CLR觸發器出錯,那麼需要使用SQL語句更改一下資料庫的配置:
exec sp_configure ‘show advanced options‘, ‘1‘;    go    reconfigure;    go    exec sp_configure ‘clr enabled‘, ‘1‘
    go
    reconfigure;    exec sp_configure ‘show advanced options‘, ‘1‘;    go

    四觸發器的管理和查看    

                 原文:http://www.cnblogs.com/shineqiujuan/archive/2009/04/23/1442137.html

                1、通過可視化操作來管理和查看觸發器

      在Microsoft SQL Server Management Studio中,選中某一資料庫的某一張表時,在“物件總管詳細”視窗中有“觸發器”項。

通過“觸發器”的右鍵菜單功能,我們可以建立觸發器。如果原來的表中已經存在了觸發器,通過雙擊“觸發器”項可以查看到具體的觸發器,在此處可以執行 修改、刪除等操作。

      2、通過查詢分析器來管理和查看觸發器
        1)查看錶中的觸發器類型:
        sp_helptrigger:返回對當前資料庫的指定表定義的 DML 觸發程序的類型。sp_helptrigger 不能用於 DDL 觸發程序。
          樣本: EXEC sp_helptrigger ‘表名‘

        2)查看觸發器的有關資訊:
        sp_help:報告有關資料庫物件(sys.sysobjects 相容視圖中列出的所有對象)、使用者定義資料類型或某種資料類型的資訊。
        樣本: EXEC sp_help ‘觸發器名‘

      3)顯示觸發器的定義:
        sp_helptext:顯示規則、預設值、未加密的預存程序、使用者定義函數、觸發器或視圖的文本。
        樣本: EXEC sp_helptext ‘觸發器名‘

      4)查看當前庫中所有的觸發器:
        查詢指令碼:SELECT * FROM Sysobjects WHERE xtype = ‘TR‘

      5)查看當前庫中所有的觸發器和與之相對應的表:
      查詢指令碼:SELECT tb2.name AS tableName,tb1.name AS triggerName FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1.parent_obj=tb2.id WHERE tb1.type=‘TR

            

sql server 觸發器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.