none
SQL SERVER 2005 權限設定問題-限制table 欄位讀取 RRS feed

  • 問題

  • 不好意思對SQL 不是很熟

    想請教線上大大

    不知道有沒有辦法可以限制某個帳號讀取table 不能夠讀取其中某個欄位資訊

    感謝大大幫忙

    2012年9月13日 上午 10:22

解答

  • 您可以透過拒絕存取某個資料表的某個欄位來達到你的目的,請參考下列的程式碼:

    use Northwind
    go
    
    --拒絕NWUser查詢Region資料表的RegionID
    deny select on Region(RegionID) to NWUser
    
    --切換使用者身分
    execute as login = 'NWUser'
    go
    
    --確認使用者身分
    select USER_NAME() db_user,SUSER_NAME() login_name
    
    --因為拒絕查詢RegionID欄位,因此SELECT ALL會出現沒有權限的訊息
    select *
    from Region
    /*
    訊息 230,層級 14,狀態 1,行 6
    結構描述 'dbo',資料庫 'Northwind',物件 'Region' 的資料行 'RegionID' 沒有 SELECT 權限。
    */
    
    select RegionDescription
    from Region
    
    /*
    回傳 RegionDescription 欄位的內容
    Eastern                                           
    Western                                           
    Northern                                          
    Southern                                          
    */
    
    --將執行內容切換回最後一個 EXECUTE AS 陳述式的呼叫者。
    revert
    go

    另外,會比較建議您可以拒絕使用者存取基礎資料表,接著透過VIEW或STORED PROCEDURE來控制使用者可以看到那些資料,這樣的作法會比較好。

    以上說明若有錯誤請指教,謝謝。
    歡迎參觀我的BLOG - 積沙成塔

    2012年9月14日 上午 12:46
    版主

所有回覆

  • Yes, you can set permission on columns.
    2012年9月13日 下午 01:01
  • 您可以透過拒絕存取某個資料表的某個欄位來達到你的目的,請參考下列的程式碼:

    use Northwind
    go
    
    --拒絕NWUser查詢Region資料表的RegionID
    deny select on Region(RegionID) to NWUser
    
    --切換使用者身分
    execute as login = 'NWUser'
    go
    
    --確認使用者身分
    select USER_NAME() db_user,SUSER_NAME() login_name
    
    --因為拒絕查詢RegionID欄位,因此SELECT ALL會出現沒有權限的訊息
    select *
    from Region
    /*
    訊息 230,層級 14,狀態 1,行 6
    結構描述 'dbo',資料庫 'Northwind',物件 'Region' 的資料行 'RegionID' 沒有 SELECT 權限。
    */
    
    select RegionDescription
    from Region
    
    /*
    回傳 RegionDescription 欄位的內容
    Eastern                                           
    Western                                           
    Northern                                          
    Southern                                          
    */
    
    --將執行內容切換回最後一個 EXECUTE AS 陳述式的呼叫者。
    revert
    go

    另外,會比較建議您可以拒絕使用者存取基礎資料表,接著透過VIEW或STORED PROCEDURE來控制使用者可以看到那些資料,這樣的作法會比較好。

    以上說明若有錯誤請指教,謝謝。
    歡迎參觀我的BLOG - 積沙成塔

    2012年9月14日 上午 12:46
    版主
  • 多謝大大回覆

    2012年9月19日 上午 10:11