12.05.2008, 19:28
общий
это ответ
Здравствуйте, PaTiFoN!
Полная спецификация для любого объекта базы данных определяется четырьмя идентификаторами : именем сервера, именем базы данных, именем владельца и именем объекта. Идентификаторы отделяются друг от друга точками, например
ServerBase.Sklad.dbo.Ostatok
В конце можно еще после точки указать имя столбца для выборки из таблицы, например
ServerBase.Sklad.dbo.Ostatok.Summa
По-умолчанию берутся текущие сервер, база и пользователь. Т.е. если уже произошло подключение к базе ( как в Query Analyzer ) , то вполне достаточно указать имя таблицs в текущей базе данных, например
Select * from Ostatok
в противном случае нужно указывать и другие недостающие данные , например если таблица находится на этом же сервере и у текущего пользователя есть права доступа к базе, то достаточно указать имя базы :
Select * from Zal..Ostatok
Если необходимо ограничить доступ простых пользователей, или сделать доступ скрытным отпользователя, то это лучше сделать через встроенные процедуры.
Желательно в Roles рабочей базы создать новую группу, например Rabota. В свойствах доступа настроить для пользователей этой группы разрешения на чтение, модификацию и выполнение каждой таблицы, вида и встроенных процедур.
Создать нового глобального пользователя, например User1 ( с ограниченными правами - ServerRoles пустые, в DatabaseAccess отметить эту базу и в нижней части отметить, что пользователь входит в группу Rabota ) .
Тогда при запуске программы пользователь будет вводить свои данные ( имя пользователя и пароль ) , под которыми производится подключение к базе.
В рабочей базе создается встроенная процедура под правами администратора и настраивается разрешение на выполнение ее пользователем. Тогда будет возможен доступ к любой таблице любой базы этого сервера от имени администратора внутри этой процедуры, без непосредственной работы пользователя с системными таблицами.
В примере приведен строка запроса из встроенной процедуры текущей базы данных, в которой в системной базе Master производится поиск мак-адреса сетевой карты ( переменная @net ) , с которой пользователь подключился к рабочей базе данных под своим именем ( переменная @user ) . Если такого подключенного пользователя нет, то возвращается значение Null .
Приложение:
select @net=(select min(net_address) from master..sysprocesses where loginame=@user)