Existe uma maneira de programar programaticamente todos os objetos associados a uma determinada tabela?

9

Eu sei que no SQL Management Studio posso clicar com o botão direito do mouse em uma tabela / trigger / key e script object as.... Existe uma maneira de fazer isso programaticamente, considerando o nome de um objeto?

Em caso afirmativo, existe uma maneira de encontrar todos os objetos (chaves primárias, chaves estrangeiras, gatilhos) associados a uma determinada tabela e script todos programaticamente?

goric
fonte

Respostas:

5

Uma maneira de começar com isso seria o seguinte:

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)

A "tabela" do SysDepends informará quais objetos dependem de outro. É hierárquico, portanto, talvez você precise executar recursivamente o SysDepends até começar a receber nulos. Às vezes, sysdepends está incompleto, aqui está um artigo com algumas outras sugestões .

A "tabela" do SysObjects informará algumas coisas sobre os objetos no banco de dados. As colunas de tipo (também xtype) informam qual é o item: tabela definida pelo usuário, processo armazenado, gatilho etc.

Então você vai querer sp_helptext cuspir o texto de um procedimento armazenado. Isso não reproduzirá o texto de um procedimento armazenado criptografado.

Qualquer solução completa e completa envolverá a programação de algo, especialmente quando estiverem envolvidos procedimentos armazenados criptografados e gatilhos. Um artigo de amostra sobre como determinar programaticamente os itens no banco de dados. O tipo de dados necessário para descriptografar os procs armazenados do SQL Server 2000 era exibido no SQL Server 2005, portanto, não era possível usar o SQL no SQL Server 2000 para descriptografar seus próprios procs armazenados criptografados (mas era possível descriptografá-los no SQL no SQL Server 2005). não me surpreenda se o mesmo se aplica à transição de 2005 para 2008. Perdi o interesse em descriptografar procedimentos armazenados há vários anos.

Tangurena
fonte
5

Esta é uma técnica em C # usando Server Management Objects - não sei como fazê-lo em puro T-SQL.

Gaius
fonte
adicionando em isso em espírito, você também pode fazer o mesmo com powershell2.0
jcolebrand
3

Eu sei como encontrar programaticamente todas as informações necessárias para o script dos objetos. Mas, para realmente criá-los, você pode precisar escrever o código de geração de script.

Se você está escrevendo um código para descobrir tudo sobre os objetos existentes, o termo para o google é "Dicionário de Dados do SQL Server".

Vou dar alguns exemplos iniciais.

Para encontrar todas as restrições de chave estrangeira em uma tabela específica:

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

Para encontrar todas as restrições de chave estrangeira que fazem referência a uma tabela específica:

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
fonte