Gibt es eine Möglichkeit, alle mit einer bestimmten Tabelle verknüpften Objekte programmgesteuert zu skripten?

9

Ich weiß, dass ich in SQL Management Studio mit der rechten Maustaste auf eine Tabelle / einen Trigger / einen Schlüssel und klicken kann script object as.... Gibt es eine Möglichkeit, dies programmgesteuert zu tun, wenn der Name eines Objekts angegeben wird?

Wenn ja, gibt es eine Möglichkeit, alle Objekte (Primärschlüssel, Fremdschlüssel, Trigger) zu finden, die einer bestimmten Tabelle zugeordnet sind, und alle programmgesteuert zu schreiben?

goric
quelle

Antworten:

5

Ein Weg, um damit zu beginnen, wäre der folgende:

DECLARE @TableName VARCHAR(50)
DECLARE @ObjectID INT
SET @TableName = '' -- the name of the objects you want to investigate

SELECT @ObjectID = [id]  FROM sysobjects WHERE name=@TableName

SELECT * FROM sysobjects WHERE name=@TableName
UNION
SELECT * FROM sysobjects WHERE id in (SELECT id FROM sysdepends WHERE depid= @ObjectID)

Die SysDepends "Tabelle" zeigt Ihnen, welche Objekte von anderen abhängig sind. Es ist hierarchisch, daher müssen Sie SysDepends möglicherweise rekursiv durchlaufen, bis Sie Nullen erhalten. Manchmal ist sysdepends unvollständig, hier ist ein Artikel mit einigen anderen Vorschlägen .

In der "Tabelle" von SysObjects erfahren Sie etwas über die Objekte in der Datenbank. In den Spalten type (auch xtype) wird angegeben, um welches Element es sich handelt: benutzerdefinierte Tabelle, gespeicherter Prozess, Trigger usw.

Dann soll sp_helptext den Text einer gespeicherten Prozedur ausspucken. Dadurch wird der Text einer verschlüsselten gespeicherten Prozedur nicht reproduziert.

Jede vollständige Lösung beinhaltet das Programmieren von etwas, insbesondere wenn verschlüsselte gespeicherte Prozeduren und Trigger beteiligt sind. Ein Beispielartikel zur programmgesteuerten Ermittlung der Elemente in der DB. Der zum Entschlüsseln gespeicherter SQL Server 2000-Prozesse erforderliche Datentyp wurde in SQL Server 2005 angezeigt, sodass Sie SQL in SQL Server 2000 nicht zum Entschlüsseln eigener verschlüsselter gespeicherter Prozesse verwenden konnten (Sie konnten sie jedoch in SQL Server 2005 in SQL entschlüsseln) Kein Wunder, wenn dies auch für den Übergang von 2005 zu 2008 gilt. Ich habe vor einigen Jahren das Interesse an der Entschlüsselung gespeicherter Prozeduren verloren.

Tangurena
quelle
5

Dies ist eine Technik in C # unter Verwendung von Serververwaltungsobjekten. Ich kenne keine Möglichkeit, dies in reinem T-SQL zu tun.

Gaius
quelle
Wenn Sie dies im Geiste hinzufügen, können Sie dasselbe auch mit Powershell2.0
jcolebrand tun.
3

Ich weiß, wie man programmgesteuert alle Informationen findet, die Sie zum Skripten der Objekte benötigen. Um sie tatsächlich zu skripten, müssen Sie den Skriptgenerierungscode möglicherweise selbst schreiben.

Wenn Sie Code schreiben, um alles über die vorhandenen Objekte zu erfahren, lautet der Begriff für Google "SQL Server Data Dictionary".

Ich werde Ihnen einige Startbeispiele geben.

So finden Sie alle Fremdschlüsseleinschränkungen für eine bestimmte Tabelle:

select * from information_schema.table_constraints where CONSTRAINT_TYPE = 'FOREIGN KEY'
and TABLE_NAME = 'aspnet_Roles'

So finden Sie alle Fremdschlüsseleinschränkungen, die auf eine bestimmte Tabelle verweisen:

select 
sys.foreign_keys.name as key_name,
pt.name as parent_table_name,
pc.name as parent_column_name,
ct.name as referenced_table_name,
cc.name as referenced_colum_name 
from sys.foreign_key_columns
inner join sys.foreign_keys on sys.foreign_key_columns.constraint_object_id = sys.foreign_keys.object_id
inner join sys.tables pt on sys.foreign_key_columns.parent_object_id = pt.object_id
inner join sys.tables ct on sys.foreign_key_columns.referenced_object_id = ct.object_id
inner join sys.columns pc on sys.foreign_key_columns.parent_object_id = pc.object_id and sys.foreign_key_columns.parent_column_id = pc.column_id
inner join sys.columns cc on sys.foreign_key_columns.referenced_object_id = cc.object_id and sys.foreign_key_columns.referenced_column_id = cc.Column_id
where ct.name = 'aspnet_Applications'
Andrew Shepherd
quelle