Результаты поиска
Проверьте наличие изменений в таблице сервера SQL?
Как я могу контролировать базу данных сервера SQL на предмет изменений в таблице без использования триггеров или изменения структуры базы данных каким-либо образом? Моя предпочтительная среда программирования-это .NET и C#.
Я хотел бы иметь возможность поддерживать любой SQL Server 2000 SP4 или новее. Мое приложение - это простая визуализация данных для продукта другой компании. Наша клиентская база исчисляется тысячами, поэтому я не хочу вводить требования, чтобы мы изменяли таблицу сторонних поставщиков при каждой установке.
Под "changes to a table" я подразумеваю изменения в табличных данных, а не изменения в структуре таблицы.
В конечном счете, я хотел бы, чтобы изменение инициировало событие в моем приложении, вместо того, чтобы проверять изменения через определенный промежуток времени.
Лучший способ действия, учитывая мои требования (никаких триггеров или модификаций схемы, SQL Server 2000 и 2005), по-видимому, заключается в использовании функции BINARY_CHECKSUM в T-SQL . Вот как я планирую это осуществить:
Каждые X секунд выполняйте следующий запрос:
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);
И сравните это с сохраненным значением. Если значение изменилось, пройдите по строкам таблицы с помощью запроса:
SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);
И сравните возвращенные контрольные суммы с сохраненными значениями.
Дебаты по дизайну: каковы хорошие способы хранения и управления версионными объектами?
Я намеренно оставляю это довольно расплывчатым на первый взгляд. Я ищу обсуждения и какие вопросы важны больше, чем я ищу трудные ответы.
Я нахожусь в середине разработки приложения, которое делает что-то вроде управления портфелем. Дизайн, который у меня есть до сих пор, - это
- Проблема: проблема, которую необходимо решить
- Решение: предлагаемое решение одной или нескольких проблем
- Отношение: отношение между двумя проблемами, двумя решениями или проблемой и решением. Далее разбивается на:
- Родитель-ребенок - своего рода категоризация / иерархия дерева
- Перекрытие-степень, в которой два решения или две проблемы действительно решают одну и ту же концепцию
- Адреса-степень, в которой проблема обращается к решению
Мой вопрос касается временной природы этих вещей. Проблемы возникают, а затем исчезают. Решения имеют ожидаемую дату разрешения, но она может быть изменена по мере их разработки. Степень взаимосвязи может меняться с течением времени по мере развития проблем и решений.
Итак, вопрос: каков наилучший дизайн для версирования этих вещей, чтобы я мог получить как текущую, так и историческую перспективу своего портфолио?
Позже: возможно, я должен сделать это более конкретным вопросом, хотя ответ @Eric Beard стоит того.
Я рассмотрел три проекта баз данных. Я буду достаточно каждого, чтобы показать свои недостатки. Мой вопрос: Что выбрать, или вы можете придумать что-то лучше?
1: проблемы (и отдельно, решения) являются самореферентными в управлении версиями.
table problems
int id | string name | text description | datetime created_at | int previous_version_id
foreign key previous_version_id -> problems.id
Это проблематично, потому что каждый раз, когда я хочу новую версию, я должен дублировать всю строку, включая этот длинный столбец description .
2: Создайте новый тип отношений: версия.
table problems
int id | string name | text description | datetime created_at
Это просто перемещает отношения из таблиц проблем и решений в таблицу отношений. Та же проблема дублирования, но, возможно, немного "cleaner", так как у меня уже есть абстрактная концепция отношений.
3: Используйте более Субверсионную структуру; переместите все атрибуты проблемы и решения в отдельную таблицу и версируйте их.
table problems
int id
table attributes
int id | int thing_id | string thing_type | string name | string value | datetime created_at | int previous_version_id
foreign key (thing_id, thing_type) -> problems.id or solutions.id
foreign key previous_version_id -> attributes.id
Это означает, что для загрузки текущей версии проблемы или решения я должен извлечь все версии атрибута, отсортировать их по дате, а затем использовать самую последнюю. Это может быть не так уж и страшно. Что кажется мне действительно плохим, так это то, что я не могу проверить эти атрибуты в базе данных. Этот столбец value должен быть свободным текстом. Я могу сделать столбец name ссылкой на отдельную таблицу attribute_names , которая имеет столбец type ,но это не заставляет правильный тип в таблице attributes .
еще позже: ответ на комментарии @Eric Beard о внешних ключах с несколькими таблицами:
Увы, то, что я описал, является упрощенным: есть только два типа вещей (проблемы и решения). На самом деле у меня есть около 9 или 10 различных типов вещей, поэтому у меня будет 9 или 10 столбцов внешних ключей под вашей стратегией. Я хотел использовать наследование одной таблицы, но эти вещи имеют так мало общего, что было бы крайне расточительно объединять их в одну таблицу.
Поддерживает ли MS-SQL таблицы в памяти?
Недавно я начал изменять некоторые из наших приложений, чтобы поддерживать MS SQL Server в качестве альтернативного бэк-энда.
Одна из проблем совместимости, с которой я столкнулся,-это использование функции MySQL CREATE TEMPORARY TABLE для создания таблиц в памяти, которые содержат данные для очень быстрого доступа во время сеанса без необходимости постоянного хранения.
Что такое эквивалент в MS SQL?
Требование состоит в том, что мне нужно иметь возможность использовать временную таблицу так же, как и любую другую, особенно JOIN с постоянными таблицами.