SQL Server запрещает обновление только определенной таблицы на основе параметра, переданного из контроллера C # - PullRequest
0 голосов
/ 19 января 2019

В нашем приложении .net есть инструмент, позволяющий набирать SQL в браузере и отправлять его для тестирования.В этом контексте, однако, мне нужно иметь возможность запретить тестировщикам писать в конкретные таблицы.Итак, основываясь на параметре, переданном из контроллера (InSupportTool = true или что-то), мне нужно знать, разрешено ли SQL Server делать обновления или вставки, скажем, в таблицу учетных записей.

Вещи, которые я пробовал до сих пор:

  1. Я пытался изучить триггеры, но нет доступного триггера before, и я слышал, что люди не рекомендуютиспользуя их, если вы можете помочь.

  2. Анализ переданной строки SQL для поиска ссылок на вставку или обновление в этой таблице.Это еще более хрупко, и я уверен, что есть бесчисленное множество способов обойти его, если кто-то захочет.

  3. Проверьте ограничение, которое, как мне кажется, является самым близким, которое я получил, ноЯ не могу собрать все вместе.

Для проверочных ограничений у меня есть это:

ALTER TABLE Accounts WITH NOCHECK 
    ADD CONSTRAINT chk_read_only_accounts CHECK(*somehow this needs to be dynamic based on parameters passed from C# controller*)

Вышеприведенное работает для предотвращения обновления этой таблицы, но толькоесли я поставлю чек, как 1 = 0.Я видел пост, где люди говорили, что вы можете использовать функцию в качестве проверки и таким образом передавать параметры, но я нахожусь на пределе моего знакомства с SQL / .net.

Учитывая то, что я 'я хочу сделать, кто-нибудь имеет опыт с чем-то вроде этого?Спасибо!

1 Ответ

0 голосов
/ 19 января 2019

Поскольку приложение работает под другой учетной записью, чем конечный пользователь, вы можете указать имя приложения в строке подключения (например, Application Name=SupportTool) и проверить это в триггере после, откатывая транзакцию по мере необходимости:

CREATE TABLE dbo.example(
    col1 int
);
GO

CREATE TRIGGER tr_example
ON dbo.example
AFTER INSERT, UPDATE, DELETE
AS
IF APP_NAME() = N'SupportTool'
BEGIN
    ROLLBACK;
    THROW 50000, 'This update is not allowed using the support tool', 1;
END;
GO

INSERT INTO dbo.example VALUES(1);
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...