Questão nº 60
Questão de Banco de Dados · FGV CGU 2021 - Tarde (nº 60)
Joana trabalha com extração e consolidação de dados e precisa ter acesso aos metadados de um banco de dados SQL Server para compreender melhor o modelo e as estruturas utilizadas.
Para começar, Joana resolveu criar uma consulta SQL que produza uma lista das tabelas, com as respectivas colunas com seus tipos de dados e outras propriedades.
O comando que Joana deve usar é:
- A```sql
select s1.name tabela, s2.name coluna,
s3.name tipo, s2.iscomputed, s2.isnullable
from sysobjects s1, syscolumns s2, systypes s3
where s1.xtype='T'
and s1.xid=s2.xid and s2.xtype=s3.xtype
and s2.xusertype=s3.xusertype
order by s1.name, s2.name
``` - B```sql
select s1.name tabela, s2.name coluna,
s3.name tipo, s2.iscomputed, s2.isnullable
from systables s1, syscolumns s2, systypes s3
where s1.xcode=s2.xcode and s2.xtype=s3.xtype
and s2.xusertype=s3.xusertype
order by s1.name, s2.name
``` - C```sql
select s1.name tabela, s2.name coluna,
s3.name tipo, s3.iscomputed, s3.isnullable
from systables s1, syscolumns s2, systypes s3
where s1.tableid=s2.tableid and s2.xtype=s3.xtype
and s2.xusertype=s3.xusertype
order by s1.name, s2.name
``` - D```sql
select s1.name tabela, s2.name coluna,
s3.name tipo, s2.iscomputed, s2.isnullable
from sysobjects s1, syscolumns s2, systypes s3
where s1.xtype='U'
and s1.id=s2.id and s2.xtype=s3.xtype
and s2.xusertype=s3.xusertype
order by s1.name, s2.name
``` (alternativa correta) - E```sql
select s1.name tabela, s2.name coluna,
s3.name tipo, s2.iscomputed, s2.isnullable
from systables s1, syscolumns s2, sysobjects s3
where s1.xid=s2.xid and s2.xtype=s3.xtype
and s2.xusertype=s3.xusertype
order by s1.name, s2.name
```
Resposta comentada
Gabarito Alternativa D
Conceito-chave: No SQL Server, os metadados (dados sobre os dados) ficam no catálogo do sistema. Para listar tabelas e colunas, usamos as tabelas de sistema sysobjects (que guarda objetos como tabelas, com xtype='U' para tabelas de usuário) e syscolumns (colunas), ligadas por id, e systypes (tipos de dados), ligada por xtype/xusertype.
- (A) Incorreta: Usa
sysobjectscomxtype='T'(que não é um tipo válido no SQL Server para tabelas de usuário; o correto é'U') e a condiçãos1.xid=s2.xidestá errada, pois a coluna de ligação és1.id=s2.id. - (B) Incorreta: Usa
systables, que não existe no SQL Server (é de outros bancos como Sybase/Informix), e a condiçãos1.xcode=s2.xcodetambém não existe. - (C) Incorreta: Usa
systables(inexistente) es1.tableid=s2.tableid(coluna inexistente), além de buscariscomputedeisnullableems3(systypes), mas essas propriedades são desyscolumns(s2). - (D) Correta: É o gabarito. Usa
sysobjectscomxtype='U'(tabela de usuário), liga corretamentes1.id=s2.id(objeto → coluna), es2.xtype=s3.xtype+s2.xusertype=s3.xusertypepara trazer o tipo de dado. As propriedadesiscomputedeisnullablevêm desyscolumns(s2). - (E) Incorreta: Usa
systables(inexistente) e a ligaçãos1.xid=s2.xidestá errada; além disso,sysobjects(s3) não é a tabela de tipos, e a condiçãos2.xtype=s3.xtypenão faz sentido nesse contexto.
Fonte: FGV CGU 2021 - Tarde Auditor Federal de Finanças e Controle - Área Tecnologia da Informação (Caderno Tipo 1). Reproduzida para fins de estudo.