Sự khác biệt giữa các bảng tạm thời cục bộ và toàn cầu trong SQL Server là gì?
Sự khác biệt giữa các bảng tạm thời cục bộ và toàn cầu trong SQL Server là gì?
Câu trả lời:
Tôi thấy giải thích này khá rõ ràng (đó là bản sao thuần túy từ Technet ):
Có hai loại bảng tạm thời: cục bộ và toàn cầu. Các bảng tạm thời cục bộ chỉ hiển thị cho những người tạo của họ trong cùng một kết nối với một phiên bản của SQL Server như khi các bảng được tạo hoặc tham chiếu lần đầu tiên. Các bảng tạm thời cục bộ sẽ bị xóa sau khi người dùng ngắt kết nối với phiên bản SQL Server. Các bảng tạm thời toàn cầu hiển thị cho bất kỳ người dùng và bất kỳ kết nối nào sau khi chúng được tạo và bị xóa khi tất cả người dùng tham chiếu bảng ngắt kết nối với phiên bản của SQL Server.
Các biến bảng ( DECLARE @t TABLE
) chỉ hiển thị với kết nối tạo ra nó và bị xóa khi kết thúc lô hoặc thủ tục lưu trữ kết thúc.
Các bảng tạm thời cục bộ ( CREATE TABLE #t
) chỉ hiển thị với kết nối tạo ra nó và bị xóa khi đóng kết nối.
Các bảng tạm thời toàn cầu ( CREATE TABLE ##t
) hiển thị cho mọi người và bị xóa khi tất cả các kết nối đã tham chiếu chúng đã đóng.
Các bảng thường trực Tempdb ( USE tempdb CREATE TABLE t
) hiển thị cho mọi người và bị xóa khi máy chủ được khởi động lại.
1.) Bảng tạm thời cục bộ chỉ tồn tại trong khoảng thời gian của kết nối hoặc, nếu được xác định bên trong câu lệnh ghép, trong khoảng thời gian của câu lệnh ghép.
Các bảng tạm thời cục bộ chỉ khả dụng cho phiên hoặc kết nối Máy chủ SQL (có nghĩa là một người dùng) đã tạo các bảng. Chúng sẽ tự động bị xóa khi phiên tạo các bảng đã bị đóng. Tên bảng tạm thời cục bộ được nhìn chằm chằm với dấu băm đơn ("#").
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp
Phạm vi của bảng tạm thời cục bộ tồn tại cho phiên hiện tại của người dùng hiện tại có nghĩa là cửa sổ truy vấn hiện tại. Nếu bạn sẽ đóng cửa sổ truy vấn hiện tại hoặc mở một cửa sổ truy vấn mới và sẽ cố gắng tìm bảng tạm thời đã tạo ở trên, nó sẽ cung cấp cho bạn lỗi.
2.) Một bảng tạm thời toàn cầu vẫn còn trong cơ sở dữ liệu vĩnh viễn, nhưng các hàng chỉ tồn tại trong một kết nối nhất định. Khi kết nối được đóng lại, dữ liệu trong bảng tạm thời toàn cầu sẽ biến mất. Tuy nhiên, định nghĩa bảng vẫn còn với cơ sở dữ liệu để truy cập khi cơ sở dữ liệu được mở lần sau.
Các bảng tạm thời toàn cầu có sẵn cho tất cả các phiên hoặc kết nối của Máy chủ SQL (có nghĩa là tất cả người dùng). Chúng có thể được tạo bởi bất kỳ người dùng kết nối SQL Server nào và chúng sẽ tự động bị xóa khi tất cả các kết nối SQL Server đã bị đóng. Tên bảng tạm thời toàn cầu được hiển thị với dấu băm kép ("##").
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp
Các bảng tạm thời toàn cầu hiển thị cho tất cả các kết nối SQL Server trong khi các bảng tạm thời cục bộ chỉ hiển thị với kết nối SQL Server hiện tại.
Trích dẫn từ Sách trực tuyến:
Các bảng tạm thời cục bộ chỉ hiển thị trong phiên hiện tại; bảng tạm thời toàn cầu được hiển thị cho tất cả các phiên.
Các bảng tạm thời được tự động loại bỏ khi chúng ra khỏi phạm vi, trừ khi được loại bỏ rõ ràng bằng cách sử dụng DROP TABLE:
Các bảng tạm thời cục bộ : nếu bạn tạo các bảng tạm thời cục bộ và sau đó mở một kết nối khác và thử truy vấn, bạn sẽ gặp lỗi sau.
các bảng tạm thời chỉ có thể truy cập trong phiên tạo ra chúng.
Bảng tạm thời toàn cầu : Đôi khi, bạn có thể muốn tạo một bảng tạm thời có thể truy cập các kết nối khác. Trong trường hợp này, bạn có thể sử dụng các bảng tạm thời toàn cầu.
Các bảng tạm thời toàn cầu chỉ bị hủy khi tất cả các phiên đề cập đến nó được đóng lại.
Điều đáng nói là cũng có: các bảng tạm thời toàn cầu trong cơ sở dữ liệu (hiện chỉ được hỗ trợ bởi Cơ sở dữ liệu SQL SQL).
Các bảng tạm thời toàn cầu cho SQL Server (được khởi tạo với ## tên bảng) được lưu trữ trong tempdb và được chia sẻ giữa tất cả các phiên của người dùng trên toàn bộ phiên bản SQL Server.
Cơ sở dữ liệu Azure SQL hỗ trợ các bảng tạm thời toàn cầu cũng được lưu trữ trong tempdb và nằm trong phạm vi cơ sở dữ liệu. Điều này có nghĩa là các bảng tạm thời toàn cầu được chia sẻ cho tất cả các phiên của người dùng trong cùng một Cơ sở dữ liệu Azure SQL. Phiên người dùng từ cơ sở dữ liệu khác không thể truy cập các bảng tạm thời toàn cầu.
-- 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'
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
ÁP DỤNG CHO: Cơ sở dữ liệu Azure SQL (tính năng trong bản xem trước công khai)
Cho phép thiết lập chức năng tự động thả cho các bảng tạm thời toàn cầu. Mặc định là BẬT, có nghĩa là các bảng tạm thời toàn cầu sẽ tự động bị hủy khi không được sử dụng bởi bất kỳ phiên nào. Khi được đặt thành TẮT, các bảng tạm thời toàn cầu cần được loại bỏ rõ ràng bằng cách sử dụng câu lệnh DROP TABLE hoặc sẽ tự động bị hủy khi khởi động lại máy chủ.
Với cơ sở dữ liệu đơn Azure Azure cơ sở dữ liệu và nhóm đàn hồi, tùy chọn này có thể được đặt trong cơ sở dữ liệu người dùng cá nhân của máy chủ Cơ sở dữ liệu SQL. Trong phiên bản SQL Server và Azure SQL Database được quản lý, tùy chọn này được đặt trong TempDB và cài đặt cơ sở dữ liệu người dùng riêng lẻ không có hiệu lực.
Tôi không thấy bất kỳ câu trả lời nào cho người dùng thấy nơi chúng ta có thể tìm thấy bảng Global Temp. Bạn có thể xem các bảng tạm thời Địa phương và Toàn cầu ở cùng một vị trí khi điều hướng trong SSMS. Ảnh chụp màn hình dưới đây được lấy từ liên kết này .
Cơ sở dữ liệu -> Cơ sở dữ liệu hệ thống -> tempdb -> Bảng tạm thời