2013-08-06 2 views
0

Запланированное задание выполняет геокодирование с помощью сценария командной строки и поэтому ему необходимо получить доступ к некоторым данным (адресам в геокодирование), хранящимся в Microsoft SQL Server.Правильный и безопасный способ выбора подмножества данных из SQL Server

Данные относятся к схеме A и состоят из данных более чем из одной таблицы.

Я думал о

  • создания входа в SQL Server, схемы и пользователя B
  • создавая вид A.VIEW1 выбирающий из A.TABLE_X и A.TABLE_Y
  • предоставление SELECT разрешение на A.VIEW1 К B

С просмотра ссылок другие таблицы, выбрав с B из A.VIEW1 бросает ошибку разрешения:

SELECT permission denied on object 'A.TABLE_X', database '...', schema '...'.

Есть ли альтернатива GRANT SELECT, на A .TABLE_X, A.TABLE_Y, ... TO B? Потому что, если я это сделаю, B может читать все данные из этих таблиц, не правда ли?

Я не хочу B, чтобы быть в состоянии сделать это, так как сервер учетных данных SQL для B будут храниться в незашифрованном виде на файловой системе или в планировщик задач. (Любая альтернатива?)

A.TABLE_X и A.TABLE_Y содержат данные о клиентах, связанных как номера банковских счетов и т.д. я мог бы ограничить GRANT к определенным столбцам, но я до сих пор не нравится эта идея.

Другой способ, чтобы заполнить временную таблицу, прежде чем с хранимая процедура A.PROC_FILL, но предоставление EXEC для В также будет не достаточно, не так ли?

ответ

0

Если вы предоставляете exec разрешения на хранимую процедуру reportproc к пользователю report_user то по умолчанию пользователь сможет выполнить эту процедуру с правами создателя и просматривать результаты без необходимости разрешения базовых таблиц.

Эта процедура может быть только select, а не заполнением таблицы.

create proc reportproc as 
begin 
    select * from a.table_x inner join a.table_y on tablex.id = table_y.id 
end 
go 
grant exec on reportproc to reportuser 

С видом на таблицы из разных схем ситуация немного сложнее.См. http://msdn.microsoft.com/en-us/library/ms188676.aspx

+0

Это не работает для меня. ** A ** может выбирать из _a.TABLE_X_. И ** A ** может выполнить exec_reportproc_. Но ** B ** (reportuser) не может выполнить после предоставления. – Mike

+0

Мне нужно добавить, что есть еще одна базовая таблица ** C.TABLE_Z **, ** A ** может выбрать. – Mike

+0

@Mike Что он говорит, когда вы пытаетесь с пользователем B? – podiluska