SQL работа в ALTER VIEW - PullRequest
       68

SQL работа в ALTER VIEW

0 голосов
/ 30 апреля 2020

На еженедельной основе данные обновляются из источника в одну из двух идентичных таблиц: Table_ODD или Table_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 Ответ

0 голосов
/ 30 апреля 2020

Я потратил немного времени, но нашел ответ!
Сначала мне нужно было создать несколько шагов, прежде чем я смог переключиться на указанный шаг работы c на основе кода ошибки.
Список шагов задания

шаг 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

Этот шаг определяет следующий шаг, который необходимо выполнить в дополнительных настройках шага:
Действие успешно: перейдите к шагу 3
Действие ошибки: перейдите к шагу 5
Помните: когда активен ..EVEN, возникает ошибка, приводящая к заданию от go до шага 5 (который активируется .. ODD)

Шаг 3: изменить представление на EVEN
ALTER View [dbo].[V_Data_] AS SELECT * FROM [dbo].[Data_EVEN]

Шаг 4: обновить таблицу состояния (изменить состояние 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'

Шаг 5: изменить представление на ODD
Шаг 6: обновленная таблица состояния (изменить статус ODD на Активный и ДАЖЕ на Пассивный)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...