2017-07-20 9 views
0

Ich versuche, alle in einer Tabelle definierten Trigger in einem bestimmten Schema in Sybase ASE 16.0 zu finden, und die Trigger können in einem anderen Schema als der angegebenen Tabelle definiert werden (Benutzer verfügt über alle erforderlichen Berechtigungen). Beispiel, unter der Tabelle wird in dbo-Schema (Standard) und die Trigger in dbo und s1-Schema erstellt.Wie finden Sie Trigger zusammen mit Schemas, die in Sybase ASE 16.0 für eine Tabelle definiert sind?

CREATE TABLE tblAllTypesTriggers ( 
    "Id"   int NOT NULL primary key, 
    "Name"   varchar(30), 
    "Salary"  int, 
    "Gender"  varchar(10), 
    "DepartmentId" int 
    ) 
LOCK ALLPAGES 
/

CREATE TRIGGER tblAllTypesTriggers_6 
ON tblAllTypesTriggers 
FOR INSERT 
AS 
BEGIN 
-- do something 
END 
/

CREATE TRIGGER s1.tblAllTypesTriggers_6 
ON tblAllTypesTriggers 
FOR INSERT 
AS 
BEGIN 
-- do something 
END 
/

Gibt es eine Möglichkeit, die Triggerdetails (Name und Schema) zu erhalten, die in dieser Tabelle definiert sind?

Ich habe folgende versucht:

select so2.name, so2.uid from sysobjects so1, sysobjects so2 where 
(so2.id = so1.deltrig or so2.id = so1.instrig or so2.id=so1.updtrig or 
so2.id=so1.seltrig) and so1.name= 'tblAllTypesTriggers' 
  • Problem: gibt nur 1 Trigger pro Trigger-Typ (1 Einsatz, 1 löschen, 1 Update-Trigger)
sp_helptrigger 'tblAllTypesTriggers'
  • Ausgabe : gibt nur für die Tabelle definierte Triggernamen an, jedoch nicht ihr Schema
sp_depends 'tblAllTypesTriggers'
  • Issue: listet auch Trigger für andere Tabellen, die dieser Tabelle beziehen sich

Antwort

0

Die sysobjects {instrig/deltrig/updtrig} Spalten ist eine Reminiszenz an die guten alten sind‘Tage, wenn ein. Tabelle könnte höchstens 1 von jedem Trigger-Typ haben. [Ja, diese Spalten werden immer noch verwendet, aber nur für den ersten Trigger, der vom Eigentümer der Tabelle erstellt wurde; oder die Besitzer Ansicht im Fall von instead of Trigger.]

Beachten Sie, dass für sysobjects.type = ‚TR‘ Einträge, die deltrig Spalt der ID der Basistabelle enthält, zu dem der Trigger gehört. .. vom sysobjects.deltrig column description:

deltrig: Stored procedure ID of a delete trigger if the entry is a table. Table ID if the entry is a trigger 

Leider wird es etwas komplizierter, dass zusätzliche Auslöser (zB in diesem Fall durch den nicht-Tabelleneigentümer erstellt) auch eine zugehörige Zeile hinzugefügt sysconstraints erhalten (sysconstraints.con strid = object_id (> trigger_name <)), mit der sysconstraints.status Spalte (eine Bitmap), die angibt, ob der Trigger zum Einfügen, Aktualisieren und/oder Löschen ist.

Arbeiten mit dem Beispiel-Code (und ersetzt s1 mit markp), das sollte Ihnen eine Vorstellung davon, was Sie gegen:

select id, 
     left(name,30) as objname, 
     type, 
     left(user_name(uid),10) as 'owner', 
     deltrig, 
     instrig, 
     updtrig 
from sysobjects 
where name like 'tblAll%' 
order by type,uid 
go 

id   objname      type owner  deltrig  instrig  updtrig 
----------- ------------------------------ ---- ---------- ----------- ----------- ----------- 
    752002679 tblAllTypesTriggers_6   TR dbo   736002622   0   0 
    816002907 tblAllTypesTriggers_6   TR markp  736002622   0   0 
    736002622 tblAllTypesTriggers   U dbo     0 752002679   0 

-- here we see the 2x triggers (type = TR) have deltrig = 736002622 = id of the table (type = U) 


select * from sysconstraints where tableid = object_id('tblAllTypesTriggers') 
go 

colid constrid tableid  error  status  spare2 
------ ----------- ----------- ----------- ----------- ----------- 
     0 816002907 736002622   0  1024   0 

-- here we see markp's trigger (constrid = 816002907) is associated with 
-- the dbo's table (tableid = 736002622), with status & 1024 = 1024 
-- indicating that this is a 'insert' trigger 

Hinweis: Sie alle oben aus dem Quellcode ableiten für sp_helptrigger. ("Duh, Mark!"?) [Und ja, der Standard sp_helptrigger könnte von einigen Änderungen profitieren, zB den Besitzer/das Schema jedes Triggers zeigen.

]

Eine schnelle, off-the-top-of-my-Kopf-Abfrage Ihre Frage zu beantworten:

select left(o1.name,30)   as tabname, 
     left(user_name(o1.uid),10) as tabowner, 
     left(o2.name,30)   as trigname, 
     left(user_name(o2.uid),10) as trigowner 
from sysobjects o1, 
     sysobjects o2 
where o1.name = 'tblAllTypesTriggers' 
and o1.type = 'U' 
and o2.deltrig = o1.id 
and o2.type = 'TR' 
order by 1,2,4,3 
go 

tabname      tabowner trigname      trigowner 
------------------------------ ---------- ------------------------------ ---------- 
tblAllTypesTriggers   dbo  tblAllTypesTriggers_6   dbo 
tblAllTypesTriggers   dbo  tblAllTypesTriggers_6   markp 

Zwischen sysobjects, sysconstraints und die Quelle für sp_helptrigger sollten Sie sein in der Lage, die Daten wie gewünscht zu schneiden.

+0

Danke für die tolle Antwort @markp. Eine weitere Klarstellung, die ich brauchte, ist, wie finden wir den Quellcode der Prozedur sp_helptrigger? Ich wollte den Status des Triggers auch wissen (aktiviert oder deaktiviert) –

+0

Verwenden Sie sp_helptext, um den Quellcode zu erhalten - oder besser, sp_showtext. – RobV

+0

@SaurabhGarg: Um den Quellcode für ein gespeichertes proc zu erhalten, können Sie 'sp_helptext 'proc_name', null, null, 'showsql'' in der db ausführen, wo der proc liegt, für' sp_helptrigger' würden Sie' execute sybsystemprocs 'ausführen. .sp_helptext 'sp_helptrigger', null, null, 'showsql'' – markp

Verwandte Themen