Quelle est la différence entre les tables temporaires locales et globales dans SQL Server?
Quelle est la différence entre les tables temporaires locales et globales dans SQL Server?
Réponses:
Je trouve cette explication assez claire (c'est une copie pure de Technet ):
Il existe deux types de tables temporaires: locales et globales. Les tables temporaires locales ne sont visibles que pour leurs créateurs lors de la même connexion à une instance de SQL Server que lors de la création ou du référencement des tables. Les tables temporaires locales sont supprimées une fois que l'utilisateur se déconnecte de l'instance de SQL Server. Les tables temporaires globales sont visibles pour tous les utilisateurs et toutes les connexions après leur création, et sont supprimées lorsque tous les utilisateurs référençant la table se déconnectent de l'instance de SQL Server.
Les variables de table ( DECLARE @t TABLE
) ne sont visibles que pour la connexion qui la crée et sont supprimées à la fin du lot ou de la procédure stockée.
Les tables temporaires locales ( CREATE TABLE #t
) ne sont visibles que par la connexion qui les crée et sont supprimées lorsque la connexion est fermée.
Les tables temporaires globales ( CREATE TABLE ##t
) sont visibles de tous et sont supprimées lorsque toutes les connexions qui les ont référencées sont fermées.
Les tables permanentes Tempdb ( USE tempdb CREATE TABLE t
) sont visibles de tous et sont supprimées au redémarrage du serveur.
1.) Une table temporaire locale n'existe que pendant la durée d'une connexion ou, si elle est définie dans une instruction composée, pendant la durée de l'instruction composée.
Les tables temporaires locales sont uniquement disponibles pour la session ou la connexion SQL Server (signifie un seul utilisateur) qui a créé les tables. Ceux-ci sont automatiquement supprimés lorsque la session qui a créé les tables est fermée. Le nom de la table temporaire locale est marqué d'un signe de hachage unique ("#").
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp
La portée de la table temporaire locale existe pour la session actuelle des moyens de l'utilisateur actuel vers la fenêtre de requête actuelle. Si vous fermez la fenêtre de requête en cours ou ouvrez une nouvelle fenêtre de requête et essayez de trouver la table temporaire créée ci-dessus, cela vous donnera l'erreur.
2.) Une table temporaire globale reste en permanence dans la base de données, mais les lignes n'existent que dans une connexion donnée. Lorsque la connexion est fermée, les données de la table temporaire globale disparaissent. Cependant, la définition de la table reste avec la base de données pour l'accès lors de la prochaine ouverture de la base de données.
Les tables temporaires globales sont disponibles pour toutes les sessions ou connexions SQL Server (signifie tous les utilisateurs). Ceux-ci peuvent être créés par n'importe quel utilisateur de connexion SQL Server et ils sont automatiquement supprimés lorsque toutes les connexions SQL Server ont été fermées. Le nom de la table temporaire globale est marqué d'un double signe de hachage ("##").
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp
Les tables temporaires globales sont visibles pour toutes les connexions SQL Server tandis que les tables temporaires locales ne sont visibles que pour la connexion SQL Server actuelle.
Citant des livres en ligne:
Les tables temporaires locales ne sont visibles que dans la session en cours; les tables temporaires globales sont visibles par toutes les sessions.
Les tables temporaires sont automatiquement supprimées lorsqu'elles sont hors de portée, sauf si elles sont explicitement supprimées à l'aide de DROP TABLE:
Tables temporaires locales : si vous créez des tables temporaires locales, puis ouvrez une autre connexion et essayez la requête, vous obtiendrez l'erreur suivante.
les tables temporaires ne sont accessibles que dans la session qui les a créées.
Tables temporaires globales : Parfois, vous souhaiterez peut-être créer une table temporaire accessible à d'autres connexions. Dans ce cas, vous pouvez utiliser des tables temporaires globales.
Les tables temporaires globales ne sont détruites que lorsque toutes les sessions qui y font référence sont fermées.
Il convient de mentionner qu'il existe également: des tables temporaires globales à portée de base de données (actuellement prises en charge uniquement par Azure SQL Database).
Les tables temporaires globales pour SQL Server (initiées avec le nom de table ##) sont stockées dans tempdb et partagées entre les sessions de tous les utilisateurs sur l'ensemble de l'instance SQL Server.
Azure SQL Database prend en charge les tables temporaires globales qui sont également stockées dans tempdb et étendues au niveau de la base de données. Cela signifie que les tables temporaires globales sont partagées pour toutes les sessions des utilisateurs au sein de la même Azure SQL Database. Les sessions utilisateur d'autres bases de données ne peuvent pas accéder aux tables temporaires globales.
-- 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'
ALTER DATABASE SCOPED CONFIGURATION
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
S'APPLIQUE À: Azure SQL Database (la fonctionnalité est en préversion publique)
Permet de définir la fonctionnalité de suppression automatique pour les tables temporaires globales. La valeur par défaut est ON, ce qui signifie que les tables temporaires globales sont automatiquement supprimées lorsqu'elles ne sont utilisées par aucune session. Lorsqu'elle est définie sur OFF, les tables temporaires globales doivent être explicitement supprimées à l'aide d'une instruction DROP TABLE ou seront automatiquement supprimées au redémarrage du serveur.
Avec les bases de données uniques et les pools élastiques Azure SQL Database, cette option peut être définie dans les bases de données utilisateur individuelles du serveur SQL Database. Dans l'instance gérée SQL Server et Azure SQL Database, cette option est définie dans TempDB et le paramètre des bases de données utilisateur individuelles n'a aucun effet.
Je n'ai vu aucune réponse montrer aux utilisateurs où nous pouvons trouver une table de température globale. Vous pouvez afficher les tables temporaires locales et globales au même emplacement lors de la navigation dans SSMS. Capture d'écran ci-dessous tirée de ce lien .
Bases de données -> Bases de données système -> tempdb -> Tables temporaires