2010-06-14 68 views
0

是否可以列出數據庫上所有表中的所有觸發器? 我可以列出所有用戶存儲過程:列出數據庫中的所有觸發器

Private Sub StoredPro() 
    Dim theServer As Server = New Server(serverName) 
    Dim myDB As Database = theServer.Databases("mydatabase") 
    Dim dt As DataTable = myDB.EnumObjects(DatabaseObjectTypes.StoredProcedure) 
End Sub 

但沒有明顯的SMO的觸發器。 (我實際上只想列出所選數據庫中的自定義觸發器,不包括名爲DEL_tablename,INS_tablename,UPD_tablename的任何觸發器)。

+0

爲了什麼數據庫,包括版本? – 2010-06-14 18:44:55

+0

2000,2005和2008通過SMO – madlan 2010-06-14 18:52:26

+0

這不可能嗎? – madlan 2010-06-22 17:54:42

回答

0

每個數據庫對象都有一個Triggers屬性,您可以迭代查找所有觸發器。
一旦您對此觸發器進行了引用,請檢查IsSystemObject屬性以檢查它是否爲用戶定義的觸發器。

foreach (DatabaseDdlTrigger oTrigger in oDatabase.Triggers) { 
if (! oTrigger.IsSystemObject) { 
    // do something 
}} 

玩得開心。

+0

嗨blorkfish,這似乎沒有列出任何觸發器,即使沒有if? (它命中循環然後退出,所以我猜它沒有在選定的數據庫上找到任何觸發器。 – madlan 2010-07-19 20:27:22

+0

嘿馬德蘭,Microsoft.SqlServer.Management.Smo.Table對象和視圖對象也有一個Triggers屬性。如果你知道有觸發器的表,也許嘗試枚舉這個屬性? – blorkfish 2010-07-20 08:44:42

+0

我看到,這些是表觸發器,所以可以解釋? – madlan 2010-07-20 16:31:34

3

https://social.msdn.microsoft.com/forums/sqlserver/en-US/bb024fd6-c0b9-441a-864e-a579fc441267/list-databasetable-triggers-via-smo

甲DatabaseDdlTrigger對象表示一個數據定義語言(DDL)觸發器,這是一個SQL Server數據庫上創建。但是,從您的描述中,我認爲您想要遍歷在SQL Server表上創建的數據操縱語言(DML)觸發器。

請參考下面的示例:

Dim srv As New Server 
Dim db As Database = srv.Databases.Item("Northwind") 
Dim tb As Table 
For Each tb In db.Tables 
    Dim trg As Trigger 
    For Each trg In tb.Triggers 
    If (((trg.Name <> ("INS_" & tb.Name)) AndAlso (trg.Name <> ("DEL_" & tb.Name))) AndAlso (trg.Name <> ("UPD_" & tb.Name))) Then 
     MessageBox.Show(trg.Name) 
    End If 
    Next 
Next 
相關問題