Como encontrar objetos do Database no SQL Server?

Fala galera, essa semana, mais uma vez, precisei criar um script para uma documentação de sistema. Estamos montando algumas Matrizes de Rastreabilidade para um projeto no cliente e precisávamos saber todos os objetos que faziam parte de um determinado conjunto de tabelas. Como no código anterior (Como calcular a massa de dados no SQL Server?), a Engine que roda lá ainda é SQL Server 2000, e não temos muitas coisas que dê para fazer utilizando os recursos novos. O código original é pro SQL Server 2000 mas eu adaptei algumas poucas coisas rapidamente para o 2008. Essa execução abaixo é resultado do SQL Server 2008.

Neste caso, precisávamos encontrar todos os objetos que seriam documentados e, de acordo com a necessidade, migrado para a aplicação off-line que estamos atuando. Veja o código T-SQL e o resultado obtido.

O script é esse:

SET NOCOUNT ON

/* MOSTRAR TODAS TABELAS DO SCHEMA VENDAS [SALES] */
print(‘*********************************************************’)
print(‘MOSTRAR TODAS TABELAS DO SCHEMA VENDAS [SALES]’)

SELECT T.NAME ‘TABELAS’
FROM sys.tables T
    INNER JOIN sys.schemas S
        ON T.schema_id = S.schema_id
WHERE S.name = ‘Sales’
DECLARE @TABELA VARCHAR(50)
SET @TABELA = ‘%Store%’

/* RELACIONAMENTOS DE 1 NIVEL DA TABELA */
print(‘*********************************************************’)
print(‘RELACIONAMENTOS DE 1 NIVEL DA TABELA’)

SELECT PK.TABLE_NAME ‘PAI’,
       FK.TABLE_NAME ‘FILHO’
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
        ON C.CONSTRAINT_NAME = PK.CONSTRAINT_NAME
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
        ON C.UNIQUE_CONSTRAINT_NAME = FK.CONSTRAINT_NAME
WHERE FK.TABLE_NAME = REPLACE(@TABELA,’%’,”)
   OR PK.TABLE_NAME = REPLACE(@TABELA,’%’,”)

/* TODOS OS OBJETOS DA TABELA */
print(‘*********************************************************’)
print(‘TODOS OS OBJETOS DA TABELA’)

SELECT O.NAME ‘NOME’,
       REPLACE(O.type_desc,’_’,’ ‘) ‘TIPO’
FROM SYS.OBJECTS O
    INNER JOIN SYSCOMMENTS C
        ON O.object_id = C.ID
WHERE C.TEXT LIKE @TABELA

/* TODAS AS CONSTRAINTS DA TABELA */
print(‘*********************************************************’)
print(‘TODAS AS CONSTRAINTS DA TABELA’)

SELECT O2.NAME ‘TABELA’,
       CL.NAME ‘COLUNA’,
       O.NAME ‘CONSTRAINT’,
       COM.TEXT ‘CONDIÇÃO’
FROM SYSCONSTRAINTS C
    INNER JOIN SYSOBJECTS O
        ON O.ID = C.CONSTID
    INNER JOIN SYSOBJECTS O2
        ON O2.ID = C.ID
    INNER JOIN SYSCOLUMNS CL
        ON CL.ID = O2.ID
        AND CL.COLID = C.COLID
    INNER JOIN SYSCOMMENTS COM
        ON O.ID = COM.ID
WHERE O2.NAME LIKE REPLACE(@TABELA,’%’,”)
  AND O2.XTYPE = ‘U’
ORDER BY O2.NAME, CL.NAME, O.NAME

SET NOCOUNT OFF

e o resultado apresentado é esse:

*********************************************************
MOSTRAR TODAS TABELAS DO SCHEMA VENDAS [SALES]
TABELAS
——————————–
Store
StoreContact
ContactCreditCard
CountryRegionCurrency
CreditCard
Currency
SalesOrderDetail
CurrencyRate
Customer
SalesOrderHeader
CustomerAddress
SalesOrderHeaderSalesReason
SalesPerson
SalesPersonQuotaHistory
SalesReason
Individual
SalesTaxRate
SalesTerritory
SalesTerritoryHistory
ShoppingCartItem
SpecialOffer
SpecialOfferProduct

*********************************************************
RELACIONAMENTOS DE 1 NIVEL DA TABELA
PAI               FILHO
—————– —————-
StoreContact      Store
Store             Customer
Store             SalesPerson

*********************************************************
TODOS OS OBJETOS DA TABELA
NOME                     TIPO
———————— —————————
uspLogError              SQL STORED PROCEDURE
iuIndividual             SQL TRIGGER
iStore                   SQL TRIGGER
vStoreWithDemographics   VIEW
ufnGetContactInformation SQL TABLE VALUED FUNCTION

*********************************************************
TODAS AS CONSTRAINTS DA TABELA
TABELA  COLUNA         CONSTRAINT             CONDIÇÃO
——- ————– ———————- ———–
Store   ModifiedDate   DF_Store_ModifiedDate  (getdate())
Store   rowguid        DF_Store_rowguid       (newid())

Mais uma vez gostaria de ver os comentários de vocês falando sobre como fariam pra chegar a essas informações.

Sobre Diego Nogare 350 Artigos
Diego Nogare é Gerente Técnico de Engenharia de Machine Learning no Itaú-Unibanco. Também é professor em programas de pós graduação no Mackenzie e na FIAP, em São Paulo. Foi nomeado como Microsoft MVP por 11 anos seguidos, e hoje faz parte do programa Microsoft Regional Director.