SMO Server.Database выдает исключение, если одна база данных на сервере не имеет пользователя SQL, с которым я использовал для создания соединения с SMO-сервером.
Я не получаю эту ошибкупроисходят при использовании локального экземпляра SQL 2017.
Например:
У меня есть сервер SQL Azure с именем 'myazuresqlserver.database.windows.net'
Создать логин на мастере:
CREATE LOGIN testlogin WITH PASSWORD = 'ThisIsMySecretPassword'
Создать 2 базы данных , DB1 и DB2.
Создайте пользователя 'testuser' в DB1, но NOT DB2:
CREATE USER testuserFOR LOGIN testlogin
Затем, используя C # и SMO, я не могу получить список баз данных для этого сервера, используя учетные данные для входа в testlogin - возникает исключение.
static void Main(string[] args)
{
string[] names = GetDatabaseNames("myazuresqlserver.database.windows.net");
}
public static string[] GetDatabaseNames(string serverName)
{
ServerConnection connection = new ServerConnection(serverName, "testuser", "ThisIsMySecretPassword");
var server = new Server(connection);
return (from Database database in server.Databases
where !database.IsSystemObject && !database.IsDatabaseSnapshot
select database.Name
).ToArray();
}
Исключение составляет:
SqlException: The server principal "testlogin" is not able to access the database "DB2" under the current security context.
Cannot open database "DB2" requested by the login. The login failed. Login failed for user 'testlogin'.
Я бы не ожидал, что будет выдано исключение, и вместо этого Server.Database, чтобы содержать только те базы данных, чьи учетные данные были действительными - это похоже на поведение локального экземпляра SQL 2017.