SQL作业到ALTER VIEW

问题描述 投票:0回答:1

在每周的基础上,数据从一个来源更新到两个相同的表格中的一个。表_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语句,所有的授权都会被删除。如何实现这一点?

tsql view conditional-statements alter
1个回答
0
投票

我花了我一点时间,但找到了答案!我必须先创建多个步骤,但我必须先创建多个步骤。我必须先创建多个步骤,然后才能根据错误代码切换到特定的工作步骤。 工作步骤列表 第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改为被动。

© www.soinside.com 2019 - 2024. All rights reserved.