1

Я получаю странное поведение, когда совмещаю олицетворение ссылок на базы данных в SQL Server 2005. Сначала я подключаюсь к серверу базы данных, используя простую аутентификацию SQL Server с помощью Вход 'John'. На этом сервере определена ссылка сервера remote_sqlserver. У меня уже есть привилегии SELECT для mydb на этом сервере. Когда я просто запросить таблицу на БД по этой ссылке сервера:Проблема при изменении контекста (олицетворение) и использовании ссылки на сервер в SQL Server 2005

SELECT count(*) 
FROM remote_sqlserver.mydb.dbo.mytable -- Works! 

После этого, я стараюсь олицетворения с тем же Логин (не спрашивайте, почему бы один сделать это, я просто экспериментировал;))

EXECUTE AS LOGIN = 'John' 

SELECT count(*) 
FROM remote_sqlserver.mydb.dbo.mytable -- Error: "Login failed for user: 'John'" 

Когда я возвращаюсь, он снова работает:

REVERT 

SELECT count(*) 
FROM remote_sqlserver.mydb.dbo.mytable -- Works! 

у вас есть какие-либо идеи, почему я получаю сообщение об ошибке с олицетворения, хотя тот же Логин может запросить TABL e без олицетворения?

BTW: После «олицетворения как я», если я запрашиваю локальную базу данных (конечно, для которой у меня достаточно прав), я не получаю никаких ошибок. Это происходит только тогда, когда я запрашиваю удаленную БД по серверной ссылке.

+0

Возможно, это была база данных по умолчанию для этого пользователя, которая не права? Я не уверен, поэтому не правильный ответ. – 2009-12-09 13:45:56

+0

Извините, я не понимаю. вы уточните? – ercan

ответ

2

Вы должны прочитать статью онлайн-книг «Расширение олицетворения базы данных с помощью EXECUTE AS».

Когда вы используете EXECUTE AS для доступа к удаленному серверу, удаленный сервер должен быть настроен на доверие вызывающему абоненту. Несмотря на то, что «родительский» и «дочерний» логины одинаковы (т. Е. «Джон»), поскольку вы используете EXECUTE AS, которые должны быть настроены на доверительные отношения. «Путь» аутентификации отличается, хотя логин один и тот же.

+0

Также рекомендуется прочитать: htt р: //www.sommarskog.se/grantperm.html # execas-crossdb Ключевое слово "TRUSTWORTHY" – ercan

1

Если вы еще не сделали, это может быть стоит иметь быстрый читать на EXECUTE AS и Ownership Chains в случае, если они могут пролить свет на проблемы у вас

2

Не было бы интересно, если аутентификация будет работать простым способом доверять тому, кого вы говорите? Можно было бы сказать: «Я Джон, дайте мне все деньги на моем счете», и банк выплатит наличные деньги. Теперь, к счастью, системы аутентификации, используемые повсюду, будут чуть более требовательными, и когда один появится и скажет: «Я - Джон», ему будет брошен вызов «Hullo John, поэтому ... какой у вас пароль?».

Точно так же происходит здесь. Вы можете заметить, что когда вы говорите EXECUTE AS Login = 'John', вы не указали пароль. Таким образом, экземпляр SQL Server, возможно, был «обманут», что вы «Джон», но никто за пределами SQL не поверит вам (и «обманывать» внутри SQL - это долгая история доверия и привилегий на самом деле, что на самом деле происходит больше как «Я SYSADMIN и я говорю, что ты должен поверить, что этот пользователь Джон!».

Если вы хотите получить доступ что-либо вне системы SQL Server и быть Джон, то вам необходимо указать пароль Джона. Обычный способ заключается в использовании объекта учетных данных с CREATE CREDENTIAL.

+0

Спасибо за легкое объяснение. Я прочту об этом подробнее. Однако в этом конкретном случае я уже подключился к серверу как Джон, прежде чем сказать «привет сервер», я просто хотел снова сказать вам: «Я ЕСМЬ Джон». Вот почему я думал, что это не должно вызывать больших проблем, если я снова и снова говорю «Я Джон» ... – ercan

+0

В тот момент, когда вы сказали ВЫПОЛНИТЬ КАК ваши предыдущие учетные данные больше не актуальны. –

+0

Но когда я запрашиваю другую * локальную базу данных после того, как я говорю EXECUTE AS, я не получаю сообщение об ошибке (см. Примечание BTW в вопросе.) Если то, что вы говорите, верно, я не могу это сделать, поскольку ну, правильно? – ercan

 Смежные вопросы

  • Нет связанных вопросов^_^