2016-10-21 6 views
3

У нас есть база данных, к которой все пользователи приложений имеют доступ, используя проверку подлинности Windows. Существует одна таблица, которую я хочу обновлять только через пользовательский интерфейс приложения, а не путем прямого входа в SQL Server Management Studio.Безопасность SQL Server: разрешить только обновление таблицы только от приложения

Я исследовал безопасность SQL Server, но все, что он говорит, это если пользователь имеет доступ к объекту базы данных, то он разрешен через любой интерфейс или студию управления. Интересно, будет ли какое-то решение для этого странного сценария.

Спасибо за вашу помощь!

ответ

2

Создайте Trigger на своем столе, чтобы предотвратить обновление из SSMS.

и отличаются имя приложения с помощью с помощью системной функции:

APP_NAME() 

Пример:

--Create Test table 
Create table test (id int , name varchar (20)) 
go 
--insert dummy data 
insert into Test values (1, 'aaaa'), (2,'bbbb') 
go 

-- create our trigger for preventing updating via SSMS 
CREATE TRIGGER trgPreventUpdateTestTableViaSSMS 
ON test 
FOR UPDATE AS 
BEGIN 
    IF APP_NAME() = 'Microsoft SQL Server Management Studio - Query' 
    begin 
     RAISERROR('Cannot update test table via using SSMS',16,1) 
     rollback 
     end 
END 
GO 

-- try update 
update Test set name = 'cccc' where id = 2 

Результат:

enter image description here

2

Вы можете настроить разрешения для таблицы только для SELECT. Затем вы можете создать хранимую процедуру для обновления этой таблицы. Вы предоставите разрешения на выполнение для пользователей, которым разрешено обновлять эту таблицу.

Чтобы запустить его из приложения, вы можете добавить параметр (например, @authentication_key), который передается из приложения (жестко закодированное в приложении). В SP вы должны проверить ключ, если он соответствует некоторому предварительно определенному значению.

Чтобы сделать код SP нечитаемым, вы создадите SP с опцией WITH ENCRYPTION. Когда вы это сделаете, вам нужно будет сохранить доступ к вашему SP в другом месте, так как вы не сможете получить источник из SQL Server.