1

sql-serverデータベースに接続してクエリを実行する簡単なc#コードを作成しました。

        cmd = new SqlCommand(txtQuery.Text.ToString().Trim(), con);
        cmd.ExecuteNonQuery();
  • 私のデータベースには、myTBという名前のテーブルがあります。私にも2人のユーザーがいます:user1(所有者)、user2(新しいユーザーが作成されました)

  • user2のユーザー名とパスワードでログイン(DBに接続)しました!

  • 次のクエリを使用して、user1によって作成されたテーブルにアクセスできます。

    "select * from user1.myTB"

    (このクエリでエラーが発生する理由はわかりません: "select * from myTB"、今は忘れてください!)

  • ここで、 user2から'select'権限を取り消したいと思います。つまり、user1によって作成されたmyTBテーブルに対してuser2にselectクエリを実行させたくないということです。

  • 私がすべきことは、私がそれに固執しているという問題です!このクエリを使用しましたが、何も変更されていません。

Q1:「selectON user1.myTBFROMuser2を取り消す」

繰り返しますが、user2はuser1.myTBから*を選択できます!!! どうして !?

これで私を助けてください。ありがとう。

4

3 に答える 3

1

user2は、おそらくロールメンバーシップから権限を取得しています。

走る:

use [<YourDatabase>]
GO

exec sp_helpuser

最初の列でユーザーを見つけてから、2番目の列を確認します。ユーザーはまたはのメンバーdb_datareaderですかdb_owner

その場合、次のようにして、たとえばdb_datareaderのメンバーシップを取り消すことができます。

exec sp_droprolemember 'db_datareader', 'user2'
GO
于 2013-02-27T13:05:37.650 に答える
1

付与しなかったものを取り消すことはできません。あなたがしたいように見えます:

  1. SELECTの権限がある理由 を調査して理解するuser2
  2. SELECTへのアクセス許可を拒否する可能性がありますuser2

許可は次のように機能します。

  • 最初に、ユーザーは自分のグループメンバーシップ(パブリックロールを含む)から派生した権限を持っています
  • GRANTは明示的に特権を付与します
  • REVOKEは、以前に付与された特権を取り戻し、グループメンバーシップから暗黙的に継承された特権を持つユーザーに戻ります。
  • DENYは特権を拒否します

優先順位のルールは、DENYがGRANTまたは継承された特権よりも優先されることです。多数のGRANTを介してアクセスできますが、1つのDENYで特権が取り消されます。セキュリティで保護された所有者(サーバー全体ですべてを所有しているメンバーとすべてdb_ownerを所有しているメンバー)に権限を付与/取り消し/拒否することはできません。sysadmin

于 2013-02-27T13:07:58.970 に答える
0

友達に感謝します、私はそれを解決し、REVOKEの代わりにDENYを使用します:

選択を拒否ONuser1.myTBTO user2

于 2013-03-01T10:44:50.690 に答える