Fundo:
Tenho vários produtos de sistema de origem, cada um em seu próprio banco de dados, que têm dependências muito limitadas entre si, e que são bastante modulares e também meio opcionais. Eles estão potencialmente em diferentes níveis de versão em sua própria manutenção.
Tenho um banco de dados de sistema de coleta de dados separado que reúne informações de uso de outros sistemas, e gostaria que ele continuasse a ser geralmente compatível com versões anteriores e posteriores dos outros sistemas. Este sistema é todo interno ao banco de dados - trabalhos agendados, procs etc. Nenhum programa externo do Windows, serviços etc.
Idealmente, os sistemas de origem exporiam interfaces consistentes e gerenciariam o que eles próprios expõem de uma forma à prova do futuro, e eu tento utilizar isso sempre que possível. Mas sempre há exceções ao que os roteiros dos outros produtos são capazes de acomodar. Eu gostaria que versões mais recentes do sistema de coleta de dados funcionassem, independentemente de uma tabela (ou tabelas) existir ou não no sistema de origem, e simplesmente anotar isso ou ignorá-lo ou registrá-lo conforme apropriado se não for apropriado para ser usado. Se esse sistema for atualizado mais tarde, não quero necessariamente ter que tocar no sistema de coleta de dados. Portanto, nenhum procs deve ter que ser alterado ou recriado.
Geralmente usamos sinônimos para cada sistema de origem para que a renomeação do banco de dados seja realizada no menor número possível de lugares (de preferência apenas nos sinônimos).
Eu experimentei um pouco e parece que você pode CREATE SYNONYM
para uma tabela/visão que ainda não existe sem uma falha. E você pode CREATE PROC
usar esses sinônimos sem falha também. Então seria possível ter o sistema instalado identicamente no sistema com e sem um dos bancos de dados de origem e deveria ser capaz de rodar sem modificações quando o banco de dados para aquele módulo for instalado (ou removido).
No momento, estou apenas procurando uma maneira de fazer as duas coisas a seguir: saber se os sinônimos apontam para algo e verificar essa coisa e garantir que ela atenda a todos os requisitos:
- Para saber com segurança se um sinônimo é válido. Quando a primeira coluna aqui é NULL, isso é suficiente para saber que é inválido?
SELECT object_id(base_object_name), * FROM sys.synonyms
- Se um sinônimo for válido, há uma maneira de obter os metadados para verificá-lo? As colunas, os tipos de dados podem ser obtidos de
sys.columns
(ouINFORMATION_SCHEMA
), mas isso precisa ser qualificado com um nome de banco de dados conhecido - a resposta abaixo seleciona em uma tabela temporária primeiro e, em seguida, analisa o esquema da tabela temporária. Existe alguma alternativa melhor?
de paris, com amor
Você pode usar sp_describe_first_result_set ou sys.dm_exec_describe_first_result_set para ver se o Synonym retorna um conjunto de resultados utilizável para você.