在每周的基础上,数据从一个来源更新到两个相同的表格中的一个。表_ODD或表_EVEN。视图将数据从活动表传输到报表工具。当前哪个表是活动的,就存储在哪个表中.所以视图要么是这样的。
Create View [dbo].[V_ReportData] AS SELECT * FROM [Table_ODD] -- for odd-week
或者...
Create View [dbo].[V_ReportData] AS SELECT * FROM [Table_EVEN] -- for even-week
只有在批准更新数据后才能进行切换,并由管理员手动启动该作业。我已经尝试了以下代码:`
Declare @NumberOfTables as int
,@ActiveTable as nvarchar(100);
Set @NumberOfTables = (Select Count(*) from [Table_Status] where Upper([Status]) = 'ACTIVE' ) ;
if @NumberOfTables = 1
BEGIN
Set @ActiveTable = (Select UPPER([TABLE_NAME]) from [Table_Status] where Upper([Status]) = 'ACTIVE' );
END;
if @ActiveTable = 'TABLE_EVEN'
BEGIN
ALTER View [dbo].[V_TABLE_] AS
SELECT *
FROM [dbo].[TABLE_ODD]
UPDATE [Table_Status]
Set [STATUS] = 'ACTIVE'
Where [TABLE_NAME] = 'TABLE_ODD'
UPDATE [Table_Status]
Set [STATUS] = 'PASSIVE'
Where [TABLE_NAME] = 'TABLE_EVEN'
END
if @ActiveTable = 'TABLE_ODD'
BEGIN
ALTER View [dbo].[V_TABLE_] AS
SELECT *
FROM [dbo].[TABLE_EVEN]
UPDATE [Table_Status]
Set [STATUS] = 'ACTIVE'
Where [TABLE_NAME] = 'TABLE_EVEN'
UPDATE [Table_Status]
Set [STATUS] = 'PASSIVE'
Where [TABLE_NAME] = 'TABLE_ODD'
END
`
但是ALTER VIEW语句可能不包含在编码的任何部分.所以我认为ALTER VIEW语句应该在一个单独的步骤中.但该步骤必须有条件地激活,即基于哪个表是活动的条件.简而言之,像这样。
if @ActiveTable = 'TABLE_EVEN'
then step 2
else step 3
DROP和CREATE视图是不推荐的,因为授权给视图。通过DROP VIEW语句,所有的授权都会被删除。如何实现这一点?
我花了我一点时间,但找到了答案!我必须先创建多个步骤,但我必须先创建多个步骤。我必须先创建多个步骤,然后才能根据错误代码切换到特定的工作步骤。 工作步骤列表 第1步:检查开关是否有效,例如,只有一个表是活动的,并且被动表的DateTimeStamp(应该是最后一次更新)比活动表更近。
Declare @NumberOfTables as int
,@ActiveTable as nvarchar(100)
,@Update_DateTime_Active as datetime
,@Update_DateTime_Passive as datetime;
Set @NumberOfTables = (Select Count(*) from [Table_Status] where Upper([Status]) = 'ACTIVE' ) ;
if @NumberOfTables = 1
BEGIN
set @Update_DateTime_Active = (Select [UPDATED] from [Table_Status] where Upper([Status]) = 'ACTIVE' );
set @Update_DateTime_Passive = (Select [UPDATED] from [Table_Status] where Upper([Status]) <> 'ACTIVE' );
END
IF @Update_DateTime_Active > @Update_DateTime_Passive
RAISERROR ('Status Active table not compatible with Update DateTimestamp',16,2)
if @NumberOfTables <> 1
RAISERROR ('Tables Data_ODD and Data_EVEN have same status',16,3)
第2步:确定当前活动的表。
Declare @NumberOfTables as int
,@ActiveTable as nvarchar(100);
Set @NumberOfTables = (Select Count(*) from [Table_Status] where Upper([Status]) = 'ACTIVE' ) ;
if @NumberOfTables = 1
BEGIN
Set @ActiveTable = (Select UPPER([TABLE_NAME]) from [Data_Table_Status] where Upper([Status]) = 'ACTIVE' );
END
if @ActiveTable = 'DATA_EVEN'
BEGIN
RAISERROR('Now switch VIEW to table ...ODD',1,1)
END
在步骤的高级设置中,这一步决定了下一步要采取的措施。记住: 当...EVEN被激活时,会出现一个错误,导致作业进入第5步(激活...ODD)。
第三步:改变视图为Even ALTER View [dbo].[V_Data_] AS SELECT * FROM [dbo].[Data_EVEN]
第四步:更新状态表(将ODD的状态改为Active,EVEN改为Passive)。
UPDATE [Data_Table_Status]
Set [STATUS] = 'ACTIVE'
Where [TABLE_NAME] = 'Data_EVEN'
UPDATE [Data_Table_Status]
Set [STATUS] = 'PASSIVE'
Where [TABLE_NAME] = 'Data_ODD'
第五步:改变视图为ODD第六步:更新状态表(将ODD的状态改为主动,将EVEN改为被动。