1

Мне нужно, чтобы таблица была синхронизирована с рекурсивным запросом CTE, который объединяется в несколько таблиц. CTE может возвращать разные результаты каждый раз, когда он выполняется (если какие-либо изменения были внесены в таблицы, к которым он присоединяется). CTE медленный, и я не могу позволить ему запускать триггер, поскольку запрос, вызвавший срабатывание триггера, не будет возвращаться до тех пор, пока не будет запущен триггер (я не хочу, чтобы простое обновление для одной записи 15 секунд, потому что он ждет на триггере, чтобы закончить). Любые подробности о том, как реализовать решение в SSMS, тоже были бы хороши, но не обязательно.Необходимо синхронизировать таблицу с запросом (представлением) в той же базе данных сервера Sql

Одним из решений было бы выполнить запланированное задание CTE и объединить результаты с таблицей. Запланированное задание может выполняться каждые несколько секунд, чтобы таблица была как можно более актуальной. Но я не знаю, как создать запланированное задание на Sql Server 2005 или как объединить результаты запроса CTE с таблицей.

Чтобы пересчитать мой вопрос:

Как сохранить таблицу в актуальном состоянии как можно ближе к реальному времени, насколько это возможно с помощью КТР?

+0

Запланированные задания могут выполняться один раз в минуту не чаще, чем каждые несколько секунд. Я подозреваю, что ответ вполне может включать очередь сервис-брокера. Насколько критично это, если таблица возвращает устаревшие данные? т.е. если «selects» блокируется, если таблица еще не синхронизирована? –

+0

Нет. Гораздо лучше держать таблицу по выбору. Это сложная задача. Что касается времени синхронизации ... это нормально, если вы будете на минуту или две из синхронизации. –

ответ

0

Я сам это понял. Используя агент сервера Sql вместе с очень классной утилитой tablediff.exe, я смог синхронизировать представление и таблицу с помощью операторов upsert/delete, генерируемых утилитой tablediff. Это потребовало временную таблицу и уникальный столбец в представлении (который я создал, объединив 2 идентификатора столбца в один (что, как я знал, сделает его уникальным)).

Это было гораздо лучшее решение, потому что мне не нужно было усекать живой стол или отбрасывать его и переименовывать временную таблицу. Плюс он работает в собственном потоке/окружении, так что это нормально, если требуется минутная работа (с использованием триггера, который всегда должен быть быстрым).

Если кому-то нужна дополнительная информация, дайте мне знать, и я обновлю эту статью.

+0

Можете ли вы опубликовать некоторый код о том, как начать с этого? – Omar