This is more or less the query that SqlSpec uses:select --distinct s.name ,ss.name as tablename ,s.crdate as created ,ObjectProperty(s.id, 'ExecIsUpdateTrigger') as isUpdate ,ObjectProperty(s.id, 'ExecIsDeleteTrigger') as isDelete ,ObjectProperty(s.id, 'ExecIsInsertTrigger') as isInsert ,ObjectProperty(s.id, 'ExecIsAfterTrigger') as isAfter ,ObjectProperty(s.id, 'ExecIsInsteadOfTrigger') as isInsteadOf ,ObjectProperty(s.id, 'ExecIsFirstDeleteTrigger') as isFirstDelete ,ObjectProperty(s.id, 'ExecIsLastDeleteTrigger') as isLastDelete ,ObjectProperty(s.id, 'ExecIsFirstInsertTrigger') as isFirstInsert ,ObjectProperty(s.id, 'ExecIsLastInsertTrigger') as isLastInsert ,ObjectProperty(s.id, 'ExecIsFirstUpdateTrigger') as isFirstUpdate ,ObjectProperty(s.id, 'ExecIsLastUpdateTrigger') as isLastUpdate ,ObjectProperty(s.id, 'ExecIsTriggerDisabled') as isDisabled ,ObjectProperty(s.id, 'ExecIsTriggerNotForRepl') as isNotForReplicationfrom sysobjects s join sysobjects ss on s.parent_obj=ss.idwhere s.xtype in ('TR') order by 1 asc
to get the DDL:select so.id ,so.name ,case when sc.encrypted=0 then sc.text else '*** code is encrypted ***' end as codefrom sysobjects so join syscomments sc on so.id=sc.idwhere 1=1 and so.xtype in ('TR') order by so.id, sc.colid
note that if the code is long, it may be broken up in to multiple rows in that second query.
elsasoft.org