Как отметил @FelixKling, наиболее вероятным сценарием является то, что узлы, которые вы ищете, еще не существуют.
Однако современные методы разработки часто могут манипулировать элементами документа за пределами дерева документов либо с DocumentFragments, либо просто отсоединением / повторным подключением текущих элементов напрямую. Такие методы могут использоваться как часть шаблонов JavaScript или для предотвращения чрезмерных операций перерисовки / переплавки, в то время как элементы, о которых идет речь, сильно изменяются.
Аналогично, новая функциональность «Теневой DOM» развертывается в современных браузерах позволяет элементам быть частью документа, но не обрабатываться запросом document.getElementById и всеми его методами sibling (querySelector и т. д.). Это делается для инкапсуляции функциональных возможностей и, в частности, скрыть его.
Опять же, скорее всего, элемент, который вы ищете, просто (пока) в документе, и вы должны сделать, как предлагает Феликс , Тем не менее, вы также должны знать, что это все чаще является не единственной причиной того, что элемент может быть необоснованным (временно или постоянно).
Смотрите на команду CHECKSUM:
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);
, Который возвратит то же число каждый раз, оно работало, пока содержание таблицы не изменилось. См. мое сообщение на этом для получения дополнительной информации:
Здесь - то, как я использовал ее для восстановления зависимостей от кэша когда измененные таблицы:
зависимость от кэша базы данных ASP.NET 1.1 (без триггеров)
Как часто необходимо проверить на изменения и насколько большой (с точки зрения размера строки) таблицы в базе данных? Если Вы будете использовать CHECKSUM_AGG(BINARY_CHECKSUM(*))
метод, предложенный John, то он просканирует каждую строку указанной таблицы. Эти NOLOCK
подсказка помогает, но на большой базе данных, Вы все еще поражаете каждую строку. Необходимо будет также сохранить контрольную сумму для каждой строки так, чтобы Вы сказали, что каждый изменился.
Вы рассмотрели движение в этом от другого угла? Если Вы не хотите изменять схему для добавления триггеров, (который имеет смысл, это не база данных), Вы рассмотрели работу с поставщиком приложений, который действительно делает базу данных?
Они могли реализовать API, который обеспечивает механизм для уведомления вспомогательного приложения, которые изменили данные. Это могло быть столь же просто как пишущий в таблицу уведомления, которая перечисляет, какая таблица и какая строка была изменена. Это могло быть реализовано через триггеры или код приложения. С Вашей стороны не имел бы значения ti, Ваше единственное беспокойство будет сканировать таблицу уведомления на периодической основе. Производительность, пораженная в базу данных, намного меньше, чем просканировала бы каждую строку для изменений.
твердая часть убедила бы поставщика приложений реализовать эту опцию. Так как это может быть дескрипторами полностью через SQL через триггеры, Вы могли сделать объем работы для них путем записи и тестирования триггеров и затем подачи кода к поставщику приложений. При наличии поставщика поддерживают триггеры, оно предотвращает ситуацию, где Ваше добавление триггера непреднамеренно заменяет триггер, предоставленный поставщиком.
Почему Вы не хотите использовать триггеры? Они - хорошая вещь, если Вы используете их правильно. Если Вы используете их в качестве способа осуществить ссылочную целостность, которая является, когда они идут от хорошего до плохо. Но если Вы используете их для контроля, их действительно не считают запретными.
К сожалению, я не думаю, что существует очевидный способ, чтобы сделать это в SQL2000. Если Вы сужаете свои требования к SQL Server 2005 (и позже), то Вы находитесь в бизнесе. Можно использовать SQLDependency
класс в System.Data.SqlClient
. См. Уведомления о Запросе в SQL Server (ADO.NET) .
Имейте задание DTS (или задание, которое запускается сервисом окон), который работает в данном интервале. Каждый раз, когда это выполняется, это получает информацию о данной таблице при помощи системы таблицы INFORMATION_SCHEMA и записывает эти данные в репозитории данных. Сравните данные, возвращенные относительно структуры таблицы с данными, возвратились в предыдущий раз. Если это отличается, то Вы знаете, что структура изменилась.
запрос В качестве примера для возврата информации относительно всех столбцов в таблице ABC (идеально перечисляющий просто столбцы от таблицы INFORMATION_SCHEMA, которую Вы хотите, вместо того, чтобы использовать *выбор ** как, я делаю здесь):
select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'ABC'
Вы контролировали бы различные столбцы и представления INFORMATION_SCHEMA в зависимости от того, как точно Вы определяете "изменения в таблице".
Произвольное предположение здесь: Если Вы не хотите изменять таблицы третьего лица, можно ли создать представление и затем поместить ли триггер на то представление?