Оператор UPDATE завершился неудачно, поскольку данные не могут быть обновлены в таблице с некластеризованным индексом columnstore

У меня есть SP, который обновляет таблицу. На этом столе у ​​меня есть триггер. Когда я запускаю SP, появляется следующая ошибка.

35330 TRG_TrackDateTime Оператор UPDATE завершился неудачно, поскольку данные не могут быть обновлены в таблице с некластеризованным индексом columnstore. Рассмотрите возможность отключения индекса columnstore перед выполнением инструкции UPDATE, а затем перестройку индекса columnstore после завершения UPDATE.

Код:

ALTER TRIGGER [TRG__TrackDateTime]
ON  [Table]
AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @rowsUpdated int

    UPDATE Table
    SET TrackDateTime = GETDATE()
    FROM INSERTED i, table t
    WHERE i.ID = t.ID
    SET @rowsUpdated=@@ROWCOUNT

    IF @rowsUpdated=0 BEGIN
        INSERT INTO Table
        SELECT TrackDateTime
        FROM INSERTED
    END
END

Как отключить и включить индексы в триггере?


person marry    schedule 22.05.2019    source источник
comment
Какую версию SQL Server вы используете? Похоже на 2012 год. В более новых версиях этого ограничения нет.   -  person Panagiotis Kanavos    schedule 22.05.2019
comment
Индексы Columnstore используются в сценариях хранилища данных, что означает, что у них есть много данных. Вы не можете отключить и снова включить индексы для каждой отдельной строки. Один из вариантов - не использовать триггеры и использовать GETDATE() в операторе UPDATE. Другой вариант - отключить индекс перед пакетным обновлением с помощью ALTER INDEX .... DISABLE и перестроить его после пакетного обновления с помощью ALTER INDEX .... REBUILD.   -  person Panagiotis Kanavos    schedule 22.05.2019
comment
@PanagiotisKanavos с использованием SSMS 2014   -  person marry    schedule 22.05.2019
comment
SSMS - это просто клиентский инструмент. Кластерные индексы columnstore в 2014 г. можно обновлять. Есть ли причина, по которой вы используете некластеризованный индекс, который включает TrackDateTime? Если вы не хотите использовать кластеризованный индекс columnstore, вы можете создать некластеризованный индекс, который не включает столбцы аудита.   -  person Panagiotis Kanavos    schedule 22.05.2019
comment
@PanagiotisKanavos Это или есть ограничение по умолчанию для столбца. Кажется немного глупым делать это с помощью триггера, если я чего-то не упускаю.   -  person TT.    schedule 22.05.2019
comment
@TT. ограничение по умолчанию будет записывать время вставки, а не время обновления. Однако предпочтительнее использовать другой механизм отслеживания. Например, запись в отдельную таблицу аудита или отслеживания времени создания / удаления для каждой строки.   -  person Panagiotis Kanavos    schedule 22.05.2019
comment
@PanagiotisKanavos Верно, глупый я :-). И действительно, делать это с помощью триггера довольно окольным путем.   -  person TT.    schedule 22.05.2019


Ответы (1)


Вы можете просто отбросить и создать индекс columnstore. Предполагая, что имя вашей таблицы - TABLE1:

IF EXISTS (SELECT * FROM sys.indexes WHERE name = 'CSIDX_TABLE1')
BEGIN
    DROP INDEX [CSIDX_TABLE1] ON [dbo].[TABLE1];
END

/* Your UPDATE here */

CREATE NONCLUSTERED COLUMNSTORE INDEX CSIDX_TABLE1 ON [dbo].[TABLE1]
( 
    Column1,Column2
)
person Tony Mathew    schedule 22.05.2019