SQL Server 2008 - данные сценария с использованием Scripter.EnumScript завершаются с ошибкой «Ошибка входа пользователя» - PullRequest
0 голосов
/ 24 сентября 2010

Я пытаюсь создать сценарий для данных таблицы.

Если я использую аутентификацию Windows (Integrated Security = true), код работает.

Если я переключаюсь на sql аутентификацию с существующим пользователем ипароль, не удается получить доступ к возвращаемым сценариям перечислимым.Пользователь является логином SQL и администратором.

Упрощенная версия кода здесь:

    //string connectionString = "Data Source=myserver; Initial Catalog=mydb; Integrated Security=True";            
    string connectionString = "Data Source=myserver; Initial Catalog=mydb; Integrated Security=False; User ID=user1; Password=1234;";

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        ServerConnection serverConnection = new ServerConnection(connection);
        Server server = new Server(serverConnection);

        Database database = server.Databases["mydb"];
        Collection<SqlSmoObject> tables = new Collection<SqlSmoObject>();
        tables.Add(database.Tables["mytable"]);

        Scripter scripter = new Scripter(server);
        scripter.Options.ScriptData = true;
        scripter.Options.ScriptSchema = false;
        var scripts = scripter.EnumScript(tables.ToArray());

        Collection<string> coll = new Collection<string>();
        foreach (var item in scripts) // error is here
        {
            coll.Add(item);
        }
    }

Иногда происходит сбой, за исключением:

  System.Data.SqlClient.SqlException occurred
  Message=Login failed for user 'user1'.
  Source=.Net SqlClient Data Provider
  ErrorCode=-2146232060
  Class=14
  LineNumber=65536
  Number=18456
  Procedure=""
  Server=myserver
  State=1
  StackTrace:
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
       at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
       at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
       at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
       at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
       at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
       at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
       at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
  InnerException:

И реже- с этим:

System.Data.SqlClient.SqlException occurred
  Message=A connection was successfully established with the server, but then an error occurred during the login process. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
  Source=.Net SqlClient Data Provider
  ErrorCode=-2146232060
  Class=20
  LineNumber=0
  Number=233
  Server=myserver
  State=0
  StackTrace:
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
  InnerException: 

Есть идеи, почему это происходит?

1 Ответ

1 голос
/ 25 сентября 2010

Похоже на ошибку Scripter.

Вероятно, Scripter закрывает существующее соединение и повторно открывает другое, используя свойство ConnectionString исходного соединения.Конечно, если информация о безопасности не сохраняется, эта строка соединения не содержит информации о пароле.

Поэтому обходной путь заключается в создании соединения с сохранением информации о безопасности:

string connectionString = "Data Source=myserver; Initial Catalog=mydb; Integrated Security=False; User ID=user1; Password=1234; Persist Security Info=True;";
// etc.
...