#.net #sql-server
#.net #sql-сервер
Вопрос:
У меня есть приложение .NET, которое хранит информацию в базе данных sql Server.
Я хочу добавить лицензирование в свое приложение, чтобы разрешить только определенное количество элементов в базе данных в зависимости от лицензии. Допустим, например, что у меня есть таблица «элементы», а лицензия предназначена для 5000 элементов.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу полагаться на то, что мое приложение не вставит элемент, если количество строк таблицы > 5000, потому что пользователь может вставлять элементы непосредственно в БД, поскольку сервер предоставляется клиентом, поэтому у него будет полный неограниченный доступ к БД. (я также не могу использовать какие-либо решения на стороне sql server из-за этой конкретной проблемы)
Кроме того, если я добавлю в таблицу поле, которое я заполняю информацией об элементе, хэшированной паролем, тогда пользователь больше не сможет добавлять элементы вручную, но тогда мне придется пробежаться по всей таблице и проверить, лицензирован ли каждый элемент, и подсчитать лицензированные элементы, прежде чем определять, добавлять каждый новый элемент или нет. Это непрактично, поскольку я получаю сотни элементов в минуту, поэтому это сильно повлияет на производительность.
Есть ли у кого-нибудь идеи о том, как этого добиться?
Комментарии:
1. Вы думали об ограничении программного обеспечения другим способом. Помимо простого знания количества строк и простого запрета приложению функционировать, если в нем более 5000 элементов, я не вижу способа. Честно говоря, вы не можете одновременно «разрешить пользователю вручную добавлять элементы» и «запретить пользователю добавлять элементы после того, как он достигнет лимита в 5000».
2. Я не хочу, чтобы пользователи вручную добавляли элементы, но проблема в том, что пользователи также будут иметь доступ к базе данных, поскольку иногда я устанавливаю приложение на их серверах.
3. Если вы получаете 100 элементов в минуту, не будет ли ваша лицензия действительна только около 50 минут? Вы уверены , что это правильный путь?
Ответ №1:
Вашим лучшим выбором может быть триггер INSTEAD OF в Items
таблице для отклонения вставок, превышающих ваш лимит.
Комментарии:
1. Пользователи будут иметь доступ к БД, поскольку это их собственный сервер и даже иногда их собственный экземпляр sql. К сожалению, я не могу использовать какой-либо метод на стороне sql.
2. @ElArZ если пользователь имеет полный контроль над базой данных, вы мало что можете сделать. Они могут прибегнуть к хитрости, чтобы противодействовать практически всему, что вы могли бы сделать на стороне клиента. Они могли бы заменить таблицу представлением, а затем по желанию менять местами части базовой таблицы.
3. @ElArZ, почему бы тебе не создать этот триггер «ВМЕСТО» и не создать его зеркальное отображение в коде. Если суперпользователь изменит или удалит триггер, вы сможете сравнить его с кодом и ограничить доступ, повторно создать триггер или просто выполнить недопустимую операцию и закрыть программу
Ответ №2:
Вы могли бы перевернуть ограничение с ног на голову и ограничить свои запросы 5000 результатами. Это можно легко сделать с помощью предложения TOP.
Таким образом, не имеет значения, сколько строк пользователь загружает в базу данных, ваша программа будет работать только с теми, на которые у нее есть лицензия.
Ответ №3:
Я также рекомендую простой триггер (который вы можете использовать на основе таблицы конфигурации, если хотите).
Я хотел бы узнать немного больше об общих бизнес-требованиях, поскольку кажется, что таблица будет заполняться менее чем за час, если вы получаете сотни строк в минуту.
Ответ №4:
Я бы отделил проверку лицензии от вашего DL все вместе. Вместо этого пусть ваше приложение в какой-то момент запустит свой сценарий проверки, а затем предпримет необходимое действие (отключение / предупреждение), если проверка завершится неудачей.
Что-то подобное должно вернуться очень быстро:
SELECT
[TableName] = so.name,
[RowCount] = MAX(si.rows)
FROM
sysobjects so,
sysindexes si
WHERE
so.xtype = 'U'
AND
si.id = OBJECT_ID(so.name)
GROUP BY
so.name
ORDER BY
2 DESC