C'è un modo per programmare a livello di script tutti gli oggetti associati a una determinata tabella?


9

So che in SQL Management Studio posso fare clic con il tasto destro su una tabella / trigger / chiave e script object as.... C'è un modo per farlo a livello di codice, dato il nome di un oggetto?

In tal caso, esiste un modo per trovare tutti gli oggetti (chiavi primarie, chiavi esterne, trigger) associati a una determinata tabella e copiarli tutti in modo programmatico?

Risposte:


5

Un modo per iniziare con questo sarebbe il seguente:

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 "tabella" di SysDepends ti dirà quali oggetti dipendono da un altro. È gerarchico, quindi potrebbe essere necessario eseguire ricorsivamente SysDepends fino a quando non si iniziano a ottenere valori null. A volte, sysdepends è incompleto, ecco un articolo con alcuni altri suggerimenti .

La "tabella" di SysObjects ti dirà alcune cose sugli oggetti nel database. Le colonne di tipo (anche xtype) indicano qual è l'elemento: tabella definita dall'utente, proc memorizzato, trigger, ecc.

Quindi si desidera che sp_helptext sputi il ​​testo di una procedura memorizzata. Ciò non riprodurrà il testo di una procedura memorizzata crittografata.

Qualsiasi soluzione completa e completa implicherà la programmazione di qualcosa, specialmente quando sono coinvolti trigger e procedure memorizzate crittografate. Un articolo di esempio sulla determinazione programmatica degli elementi nel DB. Il tipo di dati necessario per decrittografare i proc memorizzati di SQL Server 2000 è stato mostrato in SQL Server 2005, quindi non è stato possibile utilizzare SQL in SQL Server 2000 per decrittografare i propri proc memorizzati crittografati (ma è possibile decrittografarli in SQL in SQL Server 2005) e non mi sorprendere se lo stesso fosse vero per la transizione dal 2005 al 2008. Ho perso interesse a decifrare le stored procedure diversi anni fa.


5

Questa è una tecnica in C # che utilizza Server Management Objects - non conosco un modo per farlo in puro T-SQL.


aggiungendo questo in spirito, puoi anche fare lo stesso con powershell2.0
jcolebrand

3

So come trovare a livello di programmazione tutte le informazioni necessarie per creare script degli oggetti. Ma per scriverli effettivamente, potresti dover scrivere tu stesso il codice di generazione degli script.

Se stai scrivendo codice per scoprire tutto sugli oggetti esistenti, il termine per google è "SQL Server Data Dictionary".

Ti darò alcuni esempi di partenza.

Per trovare tutti i vincoli di chiave esterna su una tabella specifica:

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

Per trovare tutti i vincoli di chiave esterna che fanno riferimento a una tabella specifica:

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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.