Qual é a diferença entre tabelas temporárias locais e globais no SQL Server?
Qual é a diferença entre tabelas temporárias locais e globais no SQL Server?
Respostas:
Acho esta explicação bastante clara (é uma cópia pura da Technet ):
Existem dois tipos de tabelas temporárias: local e global. As tabelas temporárias locais são visíveis apenas para seus criadores durante a mesma conexão com uma instância do SQL Server como quando as tabelas foram criadas ou referenciadas pela primeira vez. As tabelas temporárias locais são excluídas depois que o usuário se desconecta da instância do SQL Server. As tabelas temporárias globais são visíveis para qualquer usuário e qualquer conexão após a criação e são excluídas quando todos os usuários que fazem referência à tabela se desconectam da instância do SQL Server.
As variáveis de tabela ( DECLARE @t TABLE
) são visíveis apenas para a conexão que a cria e são excluídas quando o lote ou procedimento armazenado termina.
As tabelas temporárias locais ( CREATE TABLE #t
) são visíveis apenas para a conexão que a cria e são excluídas quando a conexão é fechada.
As tabelas temporárias globais ( CREATE TABLE ##t
) são visíveis a todos e são excluídas quando todas as conexões que as referenciaram foram fechadas.
As tabelas permanentes do Tempdb ( USE tempdb CREATE TABLE t
) são visíveis para todos e são excluídas quando o servidor é reiniciado.
1.) Uma tabela temporária local existe apenas para a duração de uma conexão ou, se definida dentro de uma instrução composta, para a duração da instrução composta.
As tabelas temporárias locais estão disponíveis apenas para a sessão ou conexão do SQL Server (significa usuário único) que criou as tabelas. Eles são excluídos automaticamente quando a sessão que criou as tabelas foi fechada. O nome da tabela temporária local é marcado com um único sinal de hash ("#").
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp
O escopo da tabela temporária local existe para a sessão atual do usuário atual para a janela de consulta atual. Se você fechar a janela de consulta atual ou abrir uma nova janela de consulta e tentar encontrar a tabela temporária criada acima, isso fornecerá o erro.
2.) Uma tabela temporária global permanece permanentemente no banco de dados, mas as linhas existem apenas dentro de uma determinada conexão. Quando a conexão é fechada, os dados na tabela temporária global desaparecem. No entanto, a definição da tabela permanece no banco de dados para acesso quando o banco de dados for aberto na próxima vez.
As tabelas temporárias globais estão disponíveis para todas as sessões ou conexões do SQL Server (significa todo o usuário). Eles podem ser criados por qualquer usuário de conexão do SQL Server e excluídos automaticamente quando todas as conexões do SQL Server foram fechadas. O nome da tabela temporária global é marcado com um sinal de hash duplo ("##").
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp
As tabelas temporárias globais são visíveis para todas as conexões do SQL Server, enquanto as tabelas temporárias locais são visíveis apenas para a conexão atual do SQL Server.
Citação de Manuais Online:
As tabelas temporárias locais são visíveis apenas na sessão atual; tabelas temporárias globais são visíveis para todas as sessões.
As tabelas temporárias são eliminadas automaticamente quando ficam fora do escopo, a menos que sejam explicitamente eliminadas usando DROP TABLE:
Tabelas temporárias locais : se você criar tabelas temporárias locais, abrir outra conexão e tentar a consulta, receberá o seguinte erro.
as tabelas temporárias são acessíveis apenas dentro da sessão que as criou.
Tabelas temporárias globais : às vezes, convém criar uma tabela temporária acessível a outras conexões. Nesse caso, você pode usar tabelas temporárias globais.
As tabelas temporárias globais são destruídas apenas quando todas as sessões referentes a ela são fechadas.
Vale ressaltar que também há: tabelas temporárias globais com escopo no banco de dados (atualmente suportadas apenas pelo Banco de Dados SQL do Azure).
As tabelas temporárias globais do SQL Server (iniciadas com ## table name) são armazenadas no tempdb e compartilhadas entre as sessões de todos os usuários em toda a instância do SQL Server.
O Banco de Dados SQL do Azure oferece suporte a tabelas temporárias globais que também são armazenadas no tempdb e com escopo definido no nível do banco de dados. Isso significa que as tabelas temporárias globais são compartilhadas para as sessões de todos os usuários no mesmo banco de dados SQL do Azure. As sessões do usuário de outros bancos de dados não podem acessar tabelas temporárias globais.
-- Session A creates a global temp table ##test in Azure SQL Database testdb1 -- and adds 1 row CREATE TABLE ##test ( a int, b int); INSERT INTO ##test values (1,1); -- Session B connects to Azure SQL Database testdb1 -- and can access table ##test created by session A SELECT * FROM ##test ---Results 1,1 -- Session C connects to another database in Azure SQL Database testdb2 -- and wants to access ##test created in testdb1. -- This select fails due to the database scope for the global temp tables SELECT * FROM ##test ---Results Msg 208, Level 16, State 0, Line 1 Invalid object name '##test'
ALTERAR A CONFIGURAÇÃO DO ESCOPO DA BASE DE DADOS
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
Aplica-se a: Banco de Dados SQL do Azure (o recurso está em visualização pública)
Permite definir a funcionalidade de descarte automático para tabelas temporárias globais. O padrão é ON, o que significa que as tabelas temporárias globais são eliminadas automaticamente quando não estão em uso por nenhuma sessão. Quando definida como OFF, as tabelas temporárias globais precisam ser eliminadas explicitamente usando uma instrução DROP TABLE ou serão automaticamente eliminadas na reinicialização do servidor.
Com os bancos de dados únicos do Azure SQL Database e os pools elásticos, essa opção pode ser definida nos bancos de dados de usuários individuais do servidor de Banco de Dados SQL. Na instância gerenciada do SQL Server e do Banco de Dados SQL do Azure, essa opção é definida no TempDB e a configuração dos bancos de dados de usuários individuais não tem efeito.
Não vi nenhuma resposta mostrar aos usuários onde podemos encontrar uma tabela Temp Global. Você pode visualizar as tabelas temporárias locais e globais no mesmo local ao navegar no SSMS. Captura de tela abaixo retirada deste link .
Bancos de Dados -> Bancos de Dados do Sistema -> tempdb -> Tabelas Temporárias