Консультация № 136493
12.05.2008, 16:34
0.00 руб.
0 2 2
Здравствуйте уважаемые эксперты! Появилась необходимость обновить данные одной базы на основании данных другой. Как написать запрос в Query Analyzer там то выбираетсся только одна база... Мне говорили что запросы можно сторить даже по разным серверам, но как - то я тогда не придал этому значения... Microsoft SQL Server 2000. Заранее спасибо.

Обсуждение

давно
Модератор
137394
1850
12.05.2008, 18:36
общий
это ответ
Здравствуйте, PaTiFoN!
Имя базы указывается через две точки перед именем таблицы.
Например:
База..Таблица Или База..Таблица.Поле1, База..Таблица.Поле2 ...
Кажется, делал и выборку от разных серверов, но сейчас не на чем проверить.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
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)
Форма ответа