2017-01-27 17 views
1

サーバーを実行しているコンピュータで正常に動作しているWebアプリケーションがありますが、ローカルネットワーク上の別のデバイスでWebアプリケーションを実行しようとすると、ローカルネットワーク経由でWebアプリケーションからスキーマにアクセスする際にエラーが発生しました

The specified schema name "WORKGROUP\LAPTOP-1" either does not exist or you do not have permission to use it.

私が実行しようとしているコマンドは次のとおりです。

protected void Home_pt() 
{ 
    string nametime; 
    string name; 
    string time; 
    string tname = null; 
    SqlConnection conn = new SqlConnection("Data Source=localhost\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Public\\public website\\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;"); 

    if (thiddenfield.Value == String.Empty) 
    { 
     Show("error: empty tname"); 
    } 
    else 
    { 
     tname = thiddenfield.Value; 
    } 

    using (var cmd = new SqlCommand("SELECT name FROM trecordTable WHERE name='" + tname + "'", conn)) 
    { 
     conn.Open(); 
     using (var reader = cmd.ExecuteReader()) 
     { 
      List<string> namedatelist = new List<string>(); 
      while (reader.Read()) 
      { 
       name = reader["name"].ToString(); 
       time = DateTime.Now.ToString("MM-dd-yyyy"); 
       namedatelist.Add(name + time); 
      } 
      nametime = Regex.Replace(namedatelist[0].ToString(), "[^0-9a-zA-Z]+", ""); 
      Session["nametime"] = nametime; 
      hftstate.Value = nametime; 
     } 
    } 
} 

protected void Fill_t(object sender, EventArgs e) 
{ 
    var nametime = Session["nametime"].ToString(); 
    SqlConnection conn = new SqlConnection("Data Source=localhost\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Public\\public website\\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;"); 

    conn.Open(); 

    using (var cmdtx1 = new SqlCommand("IF OBJECT_ID('" + nametime + "') IS NULL CREATE TABLE " + nametime + "([Id] INT IDENTITY NOT NULL, [item] NVARCHAR(50) NULL, [CtrlType] NVARCHAR(50) NULL, [six] NVARCHAR(50) NULL, [seven] NVARCHAR(50) NULL, [eight] NVARCHAR(50) NULL); IF NOT EXISTS(SELECT item FROM " + nametime + ") INSERT INTO " + nametime + " (item,CtrlType,hflabel) VALUES ('At','atscroll','cstat')", conn)) 
    { 
     cmdtx1.ExecuteNonQuery(); 
    } 
} 

私はSSMSで編集する必要があります権限はありますか?

また、私は注射に脆弱だと認識していますが、まずこれを修正したいと思います。

+0

'nametime'の値は何ですか? – Sefe

+0

ユーザ入力に基づいて手順的に生成されます。基本的に入力された名前と現在の時刻。 – anesthetic

+0

私はそれがどのように作成されたのか尋ねませんでした。私はそれが価値であるかと尋ねました。あなたの問題はそこにあります。 – Sefe

答えて

1

うわー、ポストは約30秒間置かれていました。

「私はnametimeが必要なスキーマを含むように設定されていないと思われる - 通常、これは[DBO]

である。これは動作するはずです」

using (var cmdtx1 = new SqlCommand(
"IF OBJECT_ID('[dbo]." + nametime + @"') IS NULL 
    CREATE TABLE [dbo]." + nametime + @" 
    ([Id] INT IDENTITY NOT NULL, 
     [item] NVARCHAR(50) NULL, 
     [CtrlType] NVARCHAR(50) NULL, 
     [six] NVARCHAR(50) NULL, 
     [seven] NVARCHAR(50) NULL, 
     [eight] NVARCHAR(50) NULL 
    ); 


IF NOT EXISTS(SELECT item FROM [dbo]." + nametime + @") 
    INSERT INTO [dbo]." + nametime + @" 
     (item,CtrlType,hflabel) 
    VALUES ('At','atscroll','cstat')", 
conn)) 
{ 
cmdtx1.ExecuteNonQuery(); 
} 

をUbercoderをあなたがあなたの答えを再投稿場合、私はマークされますそれは正しい答えとして。

誰でもこの理由を説明できますか?

+0

スキーマを指定するのは良いコーディング方法です。 Aaron Bertrandはこれについて非常に良い投稿をしています。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/bad-habits-to-kick-avoiding-the-schema-prefix.aspx –

1

接続文字列にIntegrated Security=True;Trusted_Connection=Trueを使用するため、データベースに接続するユーザーと使用する既定のスキーマはWindows環境によって異なります。

IISは、ローカル接続とは異なるリモート接続に、別のWindowsユーザー資格情報を使用するように設定されている可能性があります。また、アプリケーション用にIISでWindows認証を有効にしている場合は、クライアントコンピュータのログオンしたWindowsユーザーがデータベースに対して認証に使用されます。

したがって、統合セキュリティを使用しないでください。また、接続できるようにするすべてのユーザーがスキーマdboにアクセスし、そのスキーマをデフォルトスキーマとして使用するようにしてください。

Windowsネットワークグループのデフォルトスキーマを設定する方法については、this articleを参照してください。


警告:Ubercoderによって提案されたSQL文でスキーマ名を指定する個人的な意見

が同様に動作しますが、これは移行することがはるかに困難にしているため、これは一般的に良いアイデアではありません異なるアプリケーションとデータベースを共有するためのSQLサーバーへのアプリケーション、またはマルチテナントシナリオを実装する場合に使用します。

また、開発者がSQL文でスキーマの接頭辞を追加することを忘れることも非常に簡単です。開発者がdboがデフォルトのスキーマであるログインを使用する場合、このエラーは開発中に簡単に検出されません。

+0

統合セキュリティを使用しないことはできますか?どのような種類の脆弱性が作成されますか? – anesthetic

+1

使用する認証の種類は、アプリケーションのシナリオによって大きく異なります。 Windowsユーザーのためのデフォルトのスキーマの設定は、確かに簡単なアプローチです。 – NineBerry

関連する問題