Tôi cần phải thả và tạo lại một bảng, vốn tồn tại để "lưu trữ" chế độ xem đắt tiền. Chế độ xem có thể thay đổi và tôi muốn bảo trì dễ dàng nhất có thể, vì vậy tôi muốn bảng mới phản ánh phiên bản mới nhất của chế độ xem.Máy chủ SQL - Thả và Tạo lại một Bảng - Truy cập Chặn Trong khi Thực hiện
Tôi cũng muốn có thể ngăn chặn lỗi đọc nếu thủ tục cố gắng truy cập vào bảng trong khi đang ở giữa bị xóa và được tạo lại. Tôi đang sử dụng một giao dịch, nhưng tôi không chắc chắn nếu điều đó sẽ làm việc trên một bảng 'giảm' cho rằng phân chia thứ hai mà nó không tồn tại.
Tôi đã thực hiện kiểm tra cơ bản, 30 x SELECT từ chế độ xem trong vòng lặp trong khi chạy chế độ xem thả/tạo lại. Không có lỗi cho đến nay.
Tôi đã coi Truncate/Delete có chèn, nhưng các cột có khả năng thay đổi trên chế độ xem trong tương lai yêu cầu tôi giữ điều này linh hoạt nhất có thể và các cột cố định sẽ không giúp ích gì với điều này.
Bất cứ ai có thể cho tôi biết liệu giao dịch sẽ bảo vệ bảng khỏi truy cập đọc trong khi bị xóa và điều này là an toàn hoặc nếu có cách nào tốt hơn?
Drop/tái Code:
BEGIN TRAN
BEGIN TRY
DROP TABLE Persisted_View_1
SELECT * INTO Persisted_View_1
FROM View_1
END TRY
BEGIN CATCH
RAISERROR('The procedure proc_PersistView1 failed to commit, the transaction was rolled back', 16, 1)
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END
END CATCH
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN
END
GO
UPDATE: truy vấn Revised Brads sau trả lời:
ALTER PROCEDURE proc_Drop_Recreate_Persisted_View_MyData
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
BEGIN TRY
-- Re create
SELECT * INTO Persisted_View_MyData_Temp FROM View_MyData
-- Create index on product ID
CREATE CLUSTERED INDEX [IX_ProductID_ProductTypeID] ON [dbo].[Persisted_View_MyData_Temp]
(
[productID] ASC,
[productTypeID] ASC
)
WITH
(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
-- Check and drop table
IF EXISTS (SELECT Id FROM sysObjects WHERE Name like 'Persisted_View_MyData')
BEGIN
DROP TABLE Persisted_View_MyData
END
EXEC sp_rename 'Persisted_View_MyData_Temp', 'Persisted_View_MyData'
END TRY
BEGIN CATCH
RAISERROR('The procedure proc_PersistViewMyData failed to commit, the transaction was rolled back', 16, 1)
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END
END CATCH
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN
END
END
Thay vì sử dụng bảng lưu trong bộ nhớ cache thủ công này, bạn có thể thực hiện chế độ xem bằng cách đặt chế độ xem được lập chỉ mục không? Sau đó, SQL sẽ xử lý tất cả các chi tiết này cho bạn. (Lưu ý rằng một số cấu trúc nhất định trong chế độ xem có thể loại trừ điều này, như UNION hoặc GROUP BYs) – BradC
@BradC, bạn có thể nhận xét thêm về cách tạo chế độ xem "chế độ xem được lập chỉ mục" không? – Brad
@Brad Mở rộng nhận xét của tôi thành câu trả lời. Xem bên dưới. – BradC