Existe-t-il un moyen de scripter par programmation tous les objets associés à une table donnée?

9

Je sais que dans SQL Management Studio, je peux faire un clic droit sur une table / déclencheur / clé et script object as.... Existe-t-il un moyen de le faire par programme, étant donné le nom d'un objet?

Dans l'affirmative, existe-t-il un moyen de trouver tous les objets (clés primaires, clés étrangères, déclencheurs) associés à une table et un script donnés, tous par programmation?

goric
la source

Réponses:

5

Un moyen de commencer avec ceci serait le suivant:

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)

La "table" SysDepends vous indiquera quels objets dépendent les uns des autres. Il est hiérarchique, vous devrez donc peut-être exécuter récursivement SysDepends jusqu'à ce que vous commenciez à obtenir des valeurs NULL. Parfois, sysdepends est incomplète, voici un article avec quelques autres suggestions .

La "table" SysObjects vous donnera des informations sur les objets de la base de données. Les colonnes type (également xtype) vous indiquent ce qu'est l'élément: table définie par l'utilisateur, proc stockée, déclencheur, etc.

Ensuite, vous souhaiterez que sp_helptext crache le texte d'une procédure stockée. Cela ne reproduira pas le texte d'une procédure stockée cryptée.

Toute solution complète impliquera la programmation de quelque chose, en particulier lorsque des procédures stockées et des déclencheurs chiffrés sont impliqués. Un exemple d'article sur la détermination par programme des éléments de la base de données. Le type de données nécessaire pour déchiffrer les proc stockés SQL Server 2000 est apparu dans SQL Server 2005, vous ne pouvez donc pas utiliser SQL dans SQL Server 2000 pour déchiffrer ses propres procs stockés chiffrés (mais vous pouvez les déchiffrer dans SQL dans SQL Server 2005) et il le ferait ne me surprendrait pas s'il en était de même pour la transition de 2005 à 2008. J'ai perdu tout intérêt à décrypter des procédures stockées il y a plusieurs années.

Tangurena
la source
5

Il s'agit d'une technique en C # utilisant des objets de gestion de serveur - je ne connais pas de moyen de le faire en T-SQL pur.

Gaius
la source
en ajoutant cela dans l'esprit, vous pouvez également faire de même avec powershell2.0
jcolebrand
3

Je sais comment trouver par programmation toutes les informations dont vous avez besoin pour scripter les objets. Mais pour les écrire, vous devrez peut-être écrire le code de génération de script vous-même.

Si vous écrivez du code pour tout savoir sur les objets existants, le terme pour google est "Dictionnaire de données SQL Server".

Je vais vous donner quelques exemples de départ.

Pour rechercher toutes les contraintes de clé étrangère sur une table spécifique:

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

Pour rechercher toutes les contraintes de clé étrangère faisant référence à une table spécifique:

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
la source