2013-02-27 56 views
1

我寫了連接到SQL服務器數據庫執行查詢一個簡單的C#代碼:SQL Server的GRANT,REVOKE權限用戶

 cmd = new SqlCommand(txtQuery.Text.ToString().Trim(), con); 
     cmd.ExecuteNonQuery(); 
  • 在我的分貝我有一個名爲myTB表。我有兩個用戶也:USER1(所有者),用戶2(創建新用戶)

  • user2的的用戶名和密碼登錄(連接到DB)!

  • 我可以訪問由用戶1與查詢波紋管創建的表:

    「從user1.myTB選擇*」

    (我不知道爲什麼我收到錯誤此查詢:「select * from myTB」,現在就忘記它!)

  • 現在我要REVOKE'select'來自user2的權限。我的意思是我不希望user2在由user1創建的myTB表上執行選擇查詢

  • 我該怎麼做纔是我困住的問題! 我使用了這個查詢,但沒有改變!

Q1: 「撤銷選擇ON user1.myTB從用戶2」

再次user2的可以做SELECT * FROM user1.myTB!爲什麼!?

請幫助我這個。 謝謝。

+0

如果執行'SELECT * FROM myTB'就相當於告訴myTB在默認架構中存在的SQL Server(dbo,除非它已被更改)。在這種情況下,儘管你沒有明確說明它,但myTB顯然屬於user1的模式,這就是爲什麼'select * from user1.myTB'起作用的原因,因爲你已經正確指定了表的位置。一般來說,總是指定一個表格所在的模式,這是很好的做法,除非你是超級懶惰的,並且把所有的東西都留在dbo中,這在很多情況下都是令人不悅的。 – 2013-02-27 15:29:04

+0

@StevePettifer謝謝:) – user1422847 2013-02-28 11:51:40

+0

順便說一下,我偶爾會把自己包括在超級懶惰的類別中 - 那個特別的句子一般不是專門針對你或你的工作! :) – 2013-02-28 15:48:02

回答

1

user2可能從角色成員身份獲取它的權限。

運行:

use [<YourDatabase>] 
GO 

exec sp_helpuser 

發現在第一列的用戶,然後看第二列。用戶是否是db_datareaderdb_owner的成員?

如果是這樣,您可以撤銷會員資格,譬如說的db_datareader,這樣做:

exec sp_droprolemember 'db_datareader', 'user2' 
GO 
1

不能撤消一些你不資助。貌似要:

  1. 調查瞭解爲什麼user2有權選擇
  2. 可能拒絕權限到SELECT user2

的許可工作,像以下:

  • 初始用戶具有從他的羣組meber(包括公共角色)
  • GRANT顯式地授予特權
  • REVOKE收回一個以前授予特權,恢復到所述用戶具有從組implictily繼承的權限(多個)memberhip
  • DENY否認特權

的優先規則是任何DENY都優先於任何GRANT或繼承特權。人們可以通過一些GRANT獲得訪問權限,但是單一的DENY將撤消權限。您無法向安全擁有者授予/拒絕/拒絕權限(db_owner擁有的所有內容sysadmin的擁有者的所有內容都在整個服務器上的所有內容)。

+0

Thansk。你是對的,但是我現在該怎麼辦?我怎麼能從表中選擇許可(即使表是dbo) – user1422847 2013-02-28 12:12:09

0

感謝網友, 我已經解決了它,並使用DENY REVOKE代替:

DENY選擇ON user1.myTB的user2

+0

爲了公平起見,Remus Rusanu提出了建議首先使用「DENY」,所以他的回答應該是被接受的。 – 2013-03-01 11:57:24