Recentemente, estávamos usando essa consulta para localizar tabelas em nosso banco de dados que não tinham índices agrupados e descobrimos que um dos resultados relatados era a tabela 'sys.sysfiles1'. Estamos executando o SQL Server 2008 e tive a impressão de que esta tabela não era mais usada (como algumas respostas apontaram, parece haver um equívoco de que esta tabela existe apenas para bancos de dados atualizados do SQL Server 2000). Além disso, não consigo selecionar nada diretamente da tabela sys.sysfiles1 (embora seja possível selecionar diretamente da exibição sys.sysfiles).
Executar o seguinte para criar um novo banco de dados em uma instalação local do SQL Server 2008 (@@version = Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64), embora o tenhamos visto em nossa instância de produção do SQL Server 2008 também) ilustra o que quero dizer:
CREATE DATABASE SysFilesTesting
--returns a row:
SELECT * FROM SysFilesTesting.sys.objects where name = 'sysfiles1'
--throws 'invalid object name' error:
SELECT * FROM SysFilesTesting.sys.sysfiles1
Por que sys.objects está relatando a existência de uma tabela sysfiles1?
Há muitos deles
Estes são realmente objetos em seus bancos de dados
Internamente, outros objetos úteis como sys.objects não existem realmente em seu banco de dados.
sysfiles1
é uma tabela de catálogo interno. Existem muitos deles (basicamente qualquer tabela com object_id entre 1 e 99 é, por definição, uma tabela de catálogo interno). O compilador de consulta se recusa a vincular consultas a eles no contexto normal; portanto, se você tentar selecioná-los, receberá o erro que vê. As conexões DAC podem se vincular a eles e recuperar dados, mas você ainda não poderá atualizá-los.Tudo isso está descrito no MSDN, veja System Base Tables .
sysfiles1
embora seja um caso especial, não documentado no link acima. Consulte https://learn.microsoft.com/en-us/archive/blogs/sqlserverstorageengine/fragmentation-part-4-what-are-heaps :Verifique o
type
doobject sysfiles1
como este:Esta é a lista completa de
types
:AF = Função agregada (CLR)
C = restrição CHECK
D = DEFAULT (restrição ou autônomo)
F = restrição FOREIGN KEY
FN = função escalar SQL
FS = função escalar Assembly (CLR)
FT = função com valor de tabela Assembly (CLR)
IF = função com valor de tabela em linha SQL
IT = tabela interna
P = Procedimento Armazenado SQL
PC = procedimento armazenado Assembly (CLR)
PG = guia de plano
PK = restrição PRIMARY KEY
R = Regra (estilo antigo, independente)
RF = procedimento de filtro de replicação
S = Tabela base do sistema
SN = Sinônimo
SQ = fila de serviço
TA = Gatilho DML de montagem (CLR)
TF = função com valor de tabela SQL
TR = gatilho SQL DML
TT = Tipo de tabela
U = Tabela (definida pelo usuário)
UQ = restrição UNIQUE
V = Ver
X = procedimento armazenado estendido
Como afirmou o @JNK, é apenas uma tabela interna que você só pode consultar diretamente pelo DAC ou indiretamente pelas visualizações do sistema.