Проверить на изменения в таблице SQL Server?

Как отметил @FelixKling, наиболее вероятным сценарием является то, что узлы, которые вы ищете, еще не существуют.

Однако современные методы разработки часто могут манипулировать элементами документа за пределами дерева документов либо с DocumentFragments, либо просто отсоединением / повторным подключением текущих элементов напрямую. Такие методы могут использоваться как часть шаблонов JavaScript или для предотвращения чрезмерных операций перерисовки / переплавки, в то время как элементы, о которых идет речь, сильно изменяются.

Аналогично, новая функциональность «Теневой DOM» развертывается в современных браузерах позволяет элементам быть частью документа, но не обрабатываться запросом document.getElementById и всеми его методами sibling (querySelector и т. д.). Это делается для инкапсуляции функциональных возможностей и, в частности, скрыть его.

Опять же, скорее всего, элемент, который вы ищете, просто (пока) в документе, и вы должны сделать, как предлагает Феликс , Тем не менее, вы также должны знать, что это все чаще является не единственной причиной того, что элемент может быть необоснованным (временно или постоянно).

137
задан Nhan 30 November 2016 в 07:50
поделиться

6 ответов

Смотрите на команду CHECKSUM:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

, Который возвратит то же число каждый раз, оно работало, пока содержание таблицы не изменилось. См. мое сообщение на этом для получения дополнительной информации:

КОНТРОЛЬНАЯ СУММА

Здесь - то, как я использовал ее для восстановления зависимостей от кэша когда измененные таблицы:
зависимость от кэша базы данных ASP.NET 1.1 (без триггеров)

95
ответ дан 23 November 2019 в 23:34
поделиться

Как часто необходимо проверить на изменения и насколько большой (с точки зрения размера строки) таблицы в базе данных? Если Вы будете использовать CHECKSUM_AGG(BINARY_CHECKSUM(*)) метод, предложенный John, то он просканирует каждую строку указанной таблицы. Эти NOLOCK подсказка помогает, но на большой базе данных, Вы все еще поражаете каждую строку. Необходимо будет также сохранить контрольную сумму для каждой строки так, чтобы Вы сказали, что каждый изменился.

Вы рассмотрели движение в этом от другого угла? Если Вы не хотите изменять схему для добавления триггеров, (который имеет смысл, это не база данных), Вы рассмотрели работу с поставщиком приложений, который действительно делает базу данных?

Они могли реализовать API, который обеспечивает механизм для уведомления вспомогательного приложения, которые изменили данные. Это могло быть столь же просто как пишущий в таблицу уведомления, которая перечисляет, какая таблица и какая строка была изменена. Это могло быть реализовано через триггеры или код приложения. С Вашей стороны не имел бы значения ti, Ваше единственное беспокойство будет сканировать таблицу уведомления на периодической основе. Производительность, пораженная в базу данных, намного меньше, чем просканировала бы каждую строку для изменений.

твердая часть убедила бы поставщика приложений реализовать эту опцию. Так как это может быть дескрипторами полностью через SQL через триггеры, Вы могли сделать объем работы для них путем записи и тестирования триггеров и затем подачи кода к поставщику приложений. При наличии поставщика поддерживают триггеры, оно предотвращает ситуацию, где Ваше добавление триггера непреднамеренно заменяет триггер, предоставленный поставщиком.

20
ответ дан 23 November 2019 в 23:34
поделиться

Почему Вы не хотите использовать триггеры? Они - хорошая вещь, если Вы используете их правильно. Если Вы используете их в качестве способа осуществить ссылочную целостность, которая является, когда они идут от хорошего до плохо. Но если Вы используете их для контроля, их действительно не считают запретными.

25
ответ дан 23 November 2019 в 23:34
поделиться

К сожалению, я не думаю, что существует очевидный способ, чтобы сделать это в SQL2000. Если Вы сужаете свои требования к SQL Server 2005 (и позже), то Вы находитесь в бизнесе. Можно использовать SQLDependency класс в System.Data.SqlClient. См. Уведомления о Запросе в SQL Server (ADO.NET) .

18
ответ дан 23 November 2019 в 23:34
поделиться

Имейте задание DTS (или задание, которое запускается сервисом окон), который работает в данном интервале. Каждый раз, когда это выполняется, это получает информацию о данной таблице при помощи системы таблицы INFORMATION_SCHEMA и записывает эти данные в репозитории данных. Сравните данные, возвращенные относительно структуры таблицы с данными, возвратились в предыдущий раз. Если это отличается, то Вы знаете, что структура изменилась.

запрос В качестве примера для возврата информации относительно всех столбцов в таблице ABC (идеально перечисляющий просто столбцы от таблицы INFORMATION_SCHEMA, которую Вы хотите, вместо того, чтобы использовать *выбор ** как, я делаю здесь):

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'ABC'

Вы контролировали бы различные столбцы и представления INFORMATION_SCHEMA в зависимости от того, как точно Вы определяете "изменения в таблице".

16
ответ дан 23 November 2019 в 23:34
поделиться

Произвольное предположение здесь: Если Вы не хотите изменять таблицы третьего лица, можно ли создать представление и затем поместить ли триггер на то представление?

13
ответ дан 23 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: