none
SQLServer 2012でログインできない。 RRS feed

  • 質問

  • いつもお世話になります。

    SQLServer2005Expressを使用して稼動しているC#2005のソースコードをC#2012、SQLServer2012 standard

    にポーティングしていますが、ログインできない現象で、往生しています。

    接続文字列とソースコードは、添付のとおりですが、いろいろ変えてみても接続できません。

    尚、ソースコードでは、接続後大きなSelect文を実行します。

    上記、ご経験の方の解決策をお教えください。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
      </configSections>
      <connectionStrings>
        <add name="TTI001.Properties.Settings.TTI001ConnectionString"
          connectionString="Data Source=TORK003\TORK003;AttachDbFilename=|DataDirectory|\TTI001.mdf;Initial Catalog=testdb;User Instance=True;User ID=TORK003;Password=TORK003"
          providerName="System.Data.SqlClient" />
        <add name="TTI001.Properties.Settings.NSPC03_TTI001" connectionString="Data Source=TORK003\TORK003;Initial Catalog=TESTDB;Persist Security Info=True;Connect Timeout=3000"
          providerName="System.Data.SqlClient" />
      </connectionStrings>
      <appSettings>
       </appSettings>
    </configuration>
    
    // C#ソースコード(例外発生場所抜粋)
    
         public DataSet SelectCmtInfo()
            {
                String dbCon = CommonFunc.getDBConnection();
                
                
                DataSet ds = new DataSet();
                //String dbroot = DataDirectory;
                using (SqlConnection connection = new SqlConnection(dbCon))
                {
                    StringBuilder queryString = new StringBuilder();
    
                    queryString.Append("SELECT a.CmtId, RegDate, UndefinedCodeCnt, PrintNgCnt,d.CmtFileName, LawNum, ");
    		(途中省略)
                    try
                    {
                        using (SqlCommand cmd = new SqlCommand(queryString.ToString(), connection))
                        {
                            cmd.CommandTimeout = 6000; // 2014/08/11 takei default is 30
                            SqlDataAdapter da = new SqlDataAdapter(cmd);
                            da.Fill(ds, "T_CmtInfo");
                        }
    
                    }
                    catch (Exception ex)
                    {
                        throw ex; //例外が発生する場所。
                    }
                }
    

    2014年8月25日 5:43

回答

  • 新しい環境では、TORK003 という名前のサーバーの、TORK003 という名前の名前つきインスタンスに接続するということで・・・

    > 名前つきインスタンスに接続するには、app.configの修正と

    正確には app.config にある接続文字列の修正です。基本的には connectionString の部分を以下のようにすれば OK のはずです。

    connectionString="Data Source=TORK003\TORK003;Initial Catalog=TESTDB;Integrated Security=True"


    > TCPポートの設定等が必要であることがわかりました。

    SQL Server も Windows アプリもローカルの PC 内にあるそうですので不要です。(SQL Server がリモートにある場合は話は別ですが)

    「ユーザー "xxxxx" はログインできませんでした。」というエラーメッセージが出るということは、Windows アプリから SQL Server には接続に行っているはずです。(TCP 接続ではなくて共有メモリなどで)

    問題の Windows アプリを動かしているユーザーのアカウントが SQL Server のログインに設定されてないので「ログインできませんでした」という結果になっているのだと思います。

    ちなみに、Management Studio が接続できるということは当然ログインに成功しているわけですが、それは先にアップされた画像の一番上の行の (SQL Server 11.0.2100 - TORK003\TORK003) 内にある TORK003\TORK003 というユーザーアカウントでログインしています。([セキュリティ]⇒[ログイン]を開いて見るとその中に TORK003\TORK003 があるはず)

    [ログイン]ノードを右クリックして[新しいログイン(N)...]をクリックするとログインの新規作成のダイアログが出てきますので、それで問題の Windows アプリを動かすユーザーのアカウントを設定してみてください。

    SQL Server では「認証」と「承認」の 2 段階に分けてセキュリティチェックを行いますが、ログインというのは「認証」までで、その先さらに「承認」のための設定が必要です。

    「承認」の設定は、これまた自分のブログで恐縮ですが、以下のような感じで行います。(あくまで「感じ」です。ご自分の条件に合わせて設定してください)

    ユーザー権限の設定
    http://surferonwww.info/BlogEngine/post/2010/09/12/Setting-user-access-right-in-SQL-Server.aspx

    • 回答としてマーク MitsuoTAKEI 2014年8月26日 0:25
    2014年8月25日 9:22

すべての返信

  • エラーメッセージの添付をわすれてしまいました。

    {”ユーザー”x”はログインできませんでした。”}

    です。よろしくお願い致します。

    2014年8月25日 5:51
  • 接続できない時にどのようなエラーが出ていますか? また、SQLCMDやSQL Server Management Studioでは接続できていますか?

    SQLServer2005Expressであり、接続文字列を見るとユーザーインスタンスを使用されていますが、SQLServer2012 standardではどのように接続されようとしていますか?
    上の質問はピンポイントで尋ねていますが、全般的には移行するにあたって、どのような知識、理解のもと、どのような移行計画をされていますか? この辺りをお話しいただけると、もう少し原因がはっきりしてくると思います。

    #追記
    エラーメッセージの件は了解しました。ログインユーザーが適切に作成されていないのかもしれません。とりあえず、SQLCMDやSQL Server Management Studioで接続できることを確認できていますか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 編集済み trapemiya 2014年8月25日 6:00 追記
    2014年8月25日 5:59
  • {”ユーザー”x”はログインできませんでした。”}

    上記のエラーメッセージがそのままなのであれば、connectionStringsが正しく取得出来ていないと思われます。

    ※CommonFunc.getDBConnection()メソッドから返却されるConnectionの内容が想定と違うのでは?

    2014年8月25日 6:01
  • app.config らしき xml ファイルに接続文字列が 2 つありますけど、どちらを使っているんですか?

    前者は User Instance=True とあるから、ユーザーインスタンスへの接続のようですが、SQL Server 認証で User ID と Password があるし(ユーザーインスタンスは Windows 認証だけがサポートされている)、後者は名前つきインスタンスに接続するもののようですが、SQL Server 認証だとすると User ID と Password がないし、Windows 認証だとすると Integrated Security=True がないし、正しいのでしょうか?


    PS. SQL Server 2012 standard (Express 版でない SQL Server) には「ユーザーインスタンス」の機能はありません。
    • 編集済み SurferOnWww 2014年8月25日 6:27 PS 追記
    2014年8月25日 6:14
  • trapemiyaさま、ご回答ありがとうございます。

    Windows認証で接続したいです。(現行どおり)、ManagementStudioではちゃんと開けます。

    エラーは、以下のとおりです。(エラーコードもなく、VisualStudio上に表示されます。)

    {”ユーザー”x”はログインできませんでした。”}

    なぜポーティングするかですが、ホスト側のメディアCMTが製造中止になるからです。

    その際、DVD化し、一部のデータレイアウトが変わるだけなので、特別高度な技術は不要と思います。

    処理内容も、入力データを編集してTIFF画像に変換するだけなので、比較的簡単です。

    よろしく、お願い致します。

    2014年8月25日 6:43
  • ManagementStudioでの結果を添付します。

    データベース名はtestdbです。(テーブル名は開示できません)

    2014年8月25日 6:46
  • SurferOnWwwさま、ご回答ありがとうございます。

    >接続文字列が 2 つありますけど、どちらを使っているんですか?

    Windows認証の方を使います。

    すみません。user,passwordを削除すると、「”ユーザー”はログインできませんでした。」のメッセージが表示され、例外になるため、追加したものです。

    >PS. SQL Server 2012 standard (Express 版でない SQL Server) には「ユーザーインスタンス」の機能はありません。

    SqlServer Management Studioでは、画面を投稿しましたように、ちゃんとログインできていますが?

    実際に試しましたが、インスタンスはいくつでも作れました。

    2014年8月25日 7:14
  • aviator__さま、ご回答ありがとうございます。

    VS2010での実行経過をお送りします。

    2014年8月25日 7:27
  • > Windows認証の方を使います。

    それは後者の方の接続文字列ですね?

    今まではローカルの PC にインストールされた Express 版の SQL Server 2005 のユーザーインスタンスに、同じくローカルの PC にインストールした Windows アプリから接続して使っていたのですか?

    そして、同様なローカル環境で、SQL Server を 2012 Standard に、Windows アプリを VS2012 で新規開発したものに置き換えたいということですか?

    > SqlServer Management Studioでは、画面を投稿しましたように、ちゃんとログインできていますが?

    それは、TORK003 という名前のサーバーの、TORK003 という名前の名前つきインスタンスに接続した状態です。ユーザーインスタンスではありません。

    ユーザーインスタンスについては、自分のブログで恐縮ですが、下記のページの説明を見てください。

    ユーザーインスタンス
    http://surferonwww.info/BlogEngine/post/2010/09/14/User-Instance-of-SQL-Server-Express.aspx

    そこにも書いてありますが、ユーザーインスタンスを利用すると、SqlConnection.Open で自動的に PC にログインしているユーザー専用のインスタンスを作り、接続文字列で指定した DB を動的にアタッチし、そのユーザーに DB 所有者の特権が与えられます。

    なのでユーザーインスタンスを利用するとログインの設定などは不要ですが、既定のインスタンス / 名前つきインスタンスではそのあたりの設定が必要です。

    そのあたりが不明でしたら、上の私の質問に答えていただいた上で、再度質問してください。

    2014年8月25日 7:28
  • レスが行き違いになりました。

    > VS2010での実行経過をお送りします。

    aviator__ さんへのレスにあった画像を見ると接続文字列は前者、即ちユーザーインスタンスに接続したいということのようですね。

    先の私の回答で書きましたように、SQL Server 2012 standard (Express 版でない SQL Server) には「ユーザーインスタンス」の機能はありませんので、その接続文字列では接続できません。

    新しい環境 (SQL Server 2012 standard) では、TORK003 という名前のサーバーの、TORK003 という名前の名前つきインスタンスに接続することになると思いますが、接続文字列の変更はもちろんログインおよび権限の設定が必要です。

    2014年8月25日 7:38
  • SurferOnWwwさま

    >今まではローカルの PC にインストールされた Express 版の SQL Server 2005 のユーザーインスタンスに、同じくローカルの PC にインストールした Windows アプリから接続して使っていたのですか?

    そうです。現行マシンは、ローカルサーバとして、アプリを稼動させています。

    >そして、同様なローカル環境で、SQL Server を 2012 Standard に、Windows アプリを VS2012 で新規開発したものに置き換えたいということですか?

    そうです。(ソースコードは現行のものを改修します。)

    >それは、TORK003 という名前のサーバーの、TORK003 という名前の名前つきインスタンスに接続した状態です。ユーザーインスタンスではありません。

    わかりました。

    なのでユーザーインスタンスを利用するとログインの設定などは不要ですが、既定のインスタンス / 名前つきインスタンスではそのあたりの設定が必要です。

    (特に名前つきインスタンスでなくても構わないです。)

    名前つきインスタンスに接続するには、app.configの修正と

    TCPポートの設定等が必要であることがわかりました。

    このあたりになると、初心者同様なので、ご教授お願い致します。

    2014年8月25日 8:17
  • 新しい環境では、TORK003 という名前のサーバーの、TORK003 という名前の名前つきインスタンスに接続するということで・・・

    > 名前つきインスタンスに接続するには、app.configの修正と

    正確には app.config にある接続文字列の修正です。基本的には connectionString の部分を以下のようにすれば OK のはずです。

    connectionString="Data Source=TORK003\TORK003;Initial Catalog=TESTDB;Integrated Security=True"


    > TCPポートの設定等が必要であることがわかりました。

    SQL Server も Windows アプリもローカルの PC 内にあるそうですので不要です。(SQL Server がリモートにある場合は話は別ですが)

    「ユーザー "xxxxx" はログインできませんでした。」というエラーメッセージが出るということは、Windows アプリから SQL Server には接続に行っているはずです。(TCP 接続ではなくて共有メモリなどで)

    問題の Windows アプリを動かしているユーザーのアカウントが SQL Server のログインに設定されてないので「ログインできませんでした」という結果になっているのだと思います。

    ちなみに、Management Studio が接続できるということは当然ログインに成功しているわけですが、それは先にアップされた画像の一番上の行の (SQL Server 11.0.2100 - TORK003\TORK003) 内にある TORK003\TORK003 というユーザーアカウントでログインしています。([セキュリティ]⇒[ログイン]を開いて見るとその中に TORK003\TORK003 があるはず)

    [ログイン]ノードを右クリックして[新しいログイン(N)...]をクリックするとログインの新規作成のダイアログが出てきますので、それで問題の Windows アプリを動かすユーザーのアカウントを設定してみてください。

    SQL Server では「認証」と「承認」の 2 段階に分けてセキュリティチェックを行いますが、ログインというのは「認証」までで、その先さらに「承認」のための設定が必要です。

    「承認」の設定は、これまた自分のブログで恐縮ですが、以下のような感じで行います。(あくまで「感じ」です。ご自分の条件に合わせて設定してください)

    ユーザー権限の設定
    http://surferonwww.info/BlogEngine/post/2010/09/12/Setting-user-access-right-in-SQL-Server.aspx

    • 回答としてマーク MitsuoTAKEI 2014年8月26日 0:25
    2014年8月25日 9:22
  • SurferOnWwwさま、ご回答ありがとうございました。

    ご指摘の接続文字列を使用し、トライしました結果

    お蔭様で、正常にログイン出来、DB検索も出来ていることが確認できました。

    懇切丁寧なご回答、ありがとうございました。

    尚、当方の確認のために結果ご報告と御礼が遅れてしまい、大変申し訳ございませんでした。

    この場をお借りして、aviator__さま、trapemiyaさまにも御礼申し上げます。

    皆様ありがとうございました。

    2014年8月26日 0:54