【问题标题】:List all triggers in a database列出数据库中的所有触发器
【发布时间】:2010-06-14 18:44:14
【问题描述】:

是否可以列出数据库上所有表中的所有触发器? 我可以列出所有用户存储过程:

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 的触发器。

【问题讨论】:

  • 什么数据库,包括版本?

标签: vb.net smo


【解决方案1】:

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

DatabaseDdlTrigger 对象表示在 SQL Server 数据库上创建的数据定义语言 (DDL) 触发器。但是,根据您的描述,我认为您希望遍历在 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

【讨论】:

    【解决方案2】:

    每个数据库对象都有一个 Triggers 属性,您可以对其进行迭代以查找所有触发器。
    获得此触发器的引用后,请检查 IsSystemObject 属性以检查它是否是用户定义的触发器。

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

    玩得开心。

    【讨论】:

    • 嗨 blorkfish,这似乎没有列出任何触发器,即使没有 if? (它到达循环然后退出,所以我猜它没有在所选数据库上找到任何触发器。
    • 嗨,Madlan,Microsoft.SqlServer.Management.Smo.Table 对象和视图对象也有一个 Triggers 属性。如果您知道有一个触发器的表,也许尝试枚举这个属性?
    • 我明白了,这些是表触发器,可以解释一下吗?
    猜你喜欢
    • 2017-05-05
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2011-05-17
    • 2014-01-21
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多