1

このようにプログラムで新しいログインとユーザーを作成します(SQLストアドプロシージャを使用)

//new login
SqlCommand cmd = new SqlCommand("sp_addlogin", conn);
cmd.CommandType = CommandType.StoredProcedure;
string login = radTextBox2.Text;
string password = radTextBox3.Text;
cmd.Parameters.Add(new SqlParameter("@loginame", login));
cmd.Parameters.Add(new SqlParameter("@passwd", password));
int i = cmd.ExecuteNonQuery();
....
//new user
SqlCommand cmd = new SqlCommand("sp_adduser", conn);
cmd.CommandType = CommandType.StoredProcedure;
string username = radTextBox1.Text;
string role;
try
{
   switch (radDropDownList1.SelectedItem.Text)
   {
     case "Admin": { role = "db_owner"; break; }
     case "Guest": { role = "db_datareader"; break; }
     case "User": { role = "db_datawriter"; break; }
     default: { this.radLabelElement1.Text = "Role was not chosen!"; return; }
   }
 }
 catch (NullReferenceException) { this.radLabelElement1.Text = "Role was not chosen!"; return; };
 string login = radTextBox2.Text;
 cmd.Parameters.Add(new SqlParameter("@loginame", login));
 cmd.Parameters.Add(new SqlParameter("@name_in_db", username));
 cmd.Parameters.Add(new SqlParameter("@grpname", role));
 int result = cmd.ExecuteNonQuery();

データベースのすべてのユーザーに、データベースのすべての権限、admin読み取り権限のみ、データベースのすべてのテーブルguestsの読み取り/書き込み/更新/削除権限をuserデフォルトで付与する必要があるためです。

db_ownerデータベース内のすべてを実行できる場合、db_datawriter はデータベース内のデータの読み取り/書き込み/更新/削除を許可され、db_datareader はデータベースからデータを読み取ることしかできないと考えました。しかし、db_datawriter ロールを持つユーザーのログインとパスワードを使用すると、(データグリッドを表示しようとしたときに) 例外が発生しました。 ..一方、db_datareader役割を持つユーザーはそれを見ることができますが、編集することはできません(したがって、正しく機能します)。

どうしたの?

4

1 に答える 1

7

読み取りと書き込みの両方の機能が必要な場合は、db_datawriter と db_datareader の両方の役割が必要になります。db_datawriter は書き込み権限のみを付与します。これは、ユーザーにデータベースへの書き込みは許可するが読み取りは許可しないというユースケースがあるためです。

于 2012-11-15T00:39:47.437 に答える