I need to drop and recreate the table that exists to "cache" the expensive view. The view may change, and I want to make the maintenance as simple as possible, so I want the new table to reflect the latest version of the view.
I also want to be able to prevent read errors if the procedure tries to access the table while it is in the middle of a fall and recreate. I am using a transaction, but I'm not sure if this will work in the table "reset" for this split second, that it does not exist.
I performed a basic test, 30 x SELECT from a view in a loop, when you run the drop / rereate view. There are no errors yet.
I looked at Truncate / Delete with an insert, but potentially changing columns in the view in the future require me to keep this as flexible as possible, and fixed columns will not help with this.
Can someone tell me if the transaction will protect the table from read access when it is deleted, is it safe, or if there is a better way?
Code Drop / Restore:
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: revised request after Brads response:
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