2011-04-27 35 views
1

由於USE [dbname]沒有在SQL Azure的支持,我想通過在連接字符串中指定數據庫名稱,然後執行CREATE TABLE...腳本連接到我的SQL Azure數據庫。但是,這會失敗,並且System.Data.SqlClient.SqlException 「CREATE TABLE權限在數據庫'master'中被拒絕。」我在這裏做錯了什麼,它試圖對主人執行這個聲明?未能CREATE TABLE在SQL Azure數據庫使用SMO

下面是一個簡單的C#代碼:

 
string connectionString = @"Data Source=tcp:MYSERVER.database.windows.net;Initial Catalog=MYDATABASE;Integrated Security=False;User [email protected];Password=PWD;Connect Timeout=60;Encrypt=True;TrustServerCertificate=True";

using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); ServerConnection serverConnection = new ServerConnection(connection); Server server = new Server(serverConnection); server.ConnectionContext.ExecuteNonQuery("CREATE TABLE New (NewId int)"); }

+1

您是否嘗試過使用SqlCommand,如下例所示:http://msdn.microsoft.com/en-us/library/ee336243.aspx? – 2011-04-27 01:14:46

+0

我得到與SqlCommand相同的錯誤 – kateroh 2011-04-27 22:36:35

回答

7

原來有與代碼我有多個問題。當涉及到SQL Azure時,SMO仍然非常古怪。所以,張貼我的調查結果,以防有人正在經歷同樣的岩石之路。

  1. SMO每次你得到的時間切換幕後的默認數據庫的數據庫對象是這樣的:
    
    Database database = server.Databases[databaseName] 
    
    初始目錄成爲大師,你可以看到它是改變server.ConnectionContext.ConnectionString連接字符串中(「正常」的SQL不這樣做)。解決方法是每次數據庫切換到Master時打開一個新的連接(並關閉舊的連接),因爲一旦建立連接(顯然,只有SQL Azure可以實現),數據庫名稱才能被更改。
  2. 打開與ServerConnection和Server進行初始化的連接有時會與第一個問題一起失敗。這會給出一個模糊的錯誤消息,指出登錄失敗,並提供聯繫客戶支持的GUID和時間戳。廢話。對於此問題的解決是打開連接,讓一個ServerConnection服務器對象的初始化過程中打開它:
  3. 最後,阿爾特()不是通過SQL Azure的服務器對象的喜歡。刪除了所有Alter的。

所以最終的代碼片段看起來是這樣的:


     string connectionString = "Server=tcp:XXXXX.database.windows.net;Database=XXXXXX;User ID=XXXXXX;Password=XXXXX;Trusted_Connection=False;Encrypt=True;trustservercertificate=true"; 
     SqlConnection connection = new SqlConnection(connectionString); 
     // do not explicitly open connection, it will be opened when Server is initialized 
     // connection.Open(); 

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

     // after this line, the default database will be switched to Master 
     Database database = server.Databases["MyDatabase"]; 

     // you can still use this database object and server connection to 
     // do certain things against this database, like adding database roles 
     // and users  
     DatabaseRole role = new DatabaseRole(database, "NewRole"); 
     role.Create(); 

     // if you want to execute a script against this database, you have to open 
     // another connection and re-initiliaze the server object 
     server.ConnectionContext.Disconnect(); 

     connection = new SqlConnection(connectionString); 
     serverConnection = new ServerConnection(connection); 
     server = new Server(serverConnection); 
     server.ConnectionContext.ExecuteNonQuery("CREATE TABLE New (NewId int)"); 

這裏是點#2的情況下,有人隱晦的例外是興趣:


Microsoft.SqlServer.Management.Common.ConnectionFailureException was unhandled 
    Message=Failed to connect to server . 
    Source=Microsoft.SqlServer.Smo 
    StackTrace: 
     at Microsoft.SqlServer.Management.Smo.DatabaseCollection.get_Item(String name) 
     InnerException: System.Data.SqlClient.SqlException 
     Message=Login failed for user 'XXXXXXXX'. 
     This session has been assigned a tracing ID of 'XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX'. Provide this tracing ID to customer support when you need assistance. 
     Source=.Net SqlClient Data Provider 
     ErrorCode=-2146232060 
     Class=14 
     LineNumber=65536 
     Number=18456 
     Procedure="" 
     Server=tcp:XXXXXXXX.database.windows.net 
     State=1 
     StackTrace: 
      at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
      at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
      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, TimeoutTimer timeout, SqlConnection owningObject) 
      at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout) 
      at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, 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) 
      at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) 
      at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 
      at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
      at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
      at System.Data.SqlClient.SqlConnection.Open() 
      at Microsoft.SqlServer.Management.Common.ConnectionManager.InternalConnect(WindowsIdentity impersonatedIdentity) 
      at Microsoft.SqlServer.Management.Common.ConnectionManager.Connect() 
+0

未打開SQL連接修復了「登錄失敗的用戶」錯誤。誰會知道?謝謝! – Nicolas 2016-05-31 13:25:35

0

只是一個瘋狂的猜測,基於恰好適合我的連接字符串。

您是否嘗試過使用

數據庫= MYDATABASE

到位

初始目錄的= MYDATABASE

在連接字符串?

0

還有一件事情幫助我 - ServerConnection應該爲每個操作斷開連接。

using (var connection = new SqlConnection(parameters.ConnectionStringToMasterDatabase)) 
      { 
       var serverConnection = new ServerConnection(connection); 
       try 
       { 
        var server = new Server(serverConnection); 
        // do something 
       } 
       finally 
       { 
        serverConnection.Disconnect(); 
       } 
      } 
using (var connection = new SqlConnection(parameters.ConnectionStringToMasterDatabase)) 
      { 
       var serverConnection = new ServerConnection(connection); 
       try 
       { 
        var server = new Server(serverConnection); 
        // do something else 
       } 
       finally 
       { 
        serverConnection.Disconnect(); 
       } 
      }