我想以最好的方式交换表.
我有一个IpToCountry表,我根据我导入的外部CSV文件每周创建一个新表.
我发现进行切换的最快方法是执行以下操作:
sp_rename IpToCountry IpToCountryOld go sp_rename IpToCountryNew IpToCountry go
这样做的问题是仍然可以在两者之间访问该表.
如何在SQL中解决此问题?
考虑使用sp_getapplock和sp_releaseapplock,但我希望尽快保持对表函数的读取.
假设您无法更新/插入现有表,为什么不使用视图包装对表的所有访问权限?
例如,您最初可能将数据存储在名为IpToCountry20090303的表中,您的视图将如下所示:
CREATE VIEW IpToCountry AS SELECT * FROM IpToCountry20090303
当新数据进入时,您可以创建并填充IpToCountry20090310表.填充表后,只需更新您的视图:
ALTER VIEW IpToCountry AS SELECT * FROM IpToCountry20090310
该开关将完全是原子的,无需任何显式锁定或事务.视图更新后,您只需删除旧表(或者如果您愿意,可以保留它).