1. 程式人生 > >在SQL Server中建立使用者角色及授權(使用SQL語句)

在SQL Server中建立使用者角色及授權(使用SQL語句)

要想成功訪問 SQL Server 資料庫中的資料, 我們需要兩個方面的授權:

  1. 獲得准許連線 SQL Server 伺服器的權利;
  2. 獲得訪問特定資料庫中資料的權利(select, update, delete, create table ...)。

假設,我們準備建立一個 dba 資料庫帳戶,用來管理資料庫 mydb。

1. 首先在 SQL Server 伺服器級別,建立登陸帳戶(create login)

--建立登陸帳戶(create login)
create login dba with password='[email protected]', default_database=
mydb

登陸帳戶名為:“dba”,登陸密碼:[email protected]”,預設連線到的資料庫:“mydb”。 這時候,dba 帳戶就可以連線到 SQL Server 伺服器上了。但是此時還不能 訪問資料庫中的物件(嚴格的說,此時 dba 帳戶預設是 guest 資料庫使用者身份, 可以訪問 guest 能夠訪問的資料庫物件)。

要使 dba 帳戶能夠在 mydb 資料庫中訪問自己需要的物件, 需要在資料庫 mydb 中建立一個“資料庫使用者”,賦予這個“資料庫使用者” 某些訪問許可權,並且把登陸帳戶“dba” 和這個“資料庫使用者” 對映起來。 習慣上,“資料庫使用者” 的名字和 “登陸帳戶”的名字相同,即:“dba”。 建立“資料庫使用者”和建立對映關係只需要一步即可完成:

2. 建立資料庫使用者(create user):

--為登陸賬戶建立資料庫使用者(create user),在mydb資料庫中的security中的user下可以找到新建立的dba
create user dba for login dba with default_schema=dbo

並指定資料庫使用者“dba” 的預設 schema 是“dbo”。這意味著 使用者“dba” 在執行“select * from t”,實際上執行的是 “select * from dbo.t”。

3. 通過加入資料庫角色,賦予資料庫使用者“dba”許可權:

--通過加入資料庫角色,賦予資料庫使用者“db_owner”許可權
exec sp_addrolemember 'db_owner', 'dba'

此時,dba 就可以全權管理資料庫 mydb 中的物件了。

如果想讓 SQL Server 登陸帳戶“dba”訪問多個數據庫,比如 mydb2。 可以讓 sa 執行下面的語句:

--讓 SQL Server 登陸帳戶“dba”訪問多個數據庫
use mydb2
go create user dba for login dba with default_schema=dbo
go exec sp_addrolemember 'db_owner', 'dba' go

此時,dba 就可以有兩個資料庫 mydb, mydb2 的管理許可權了!

完整的程式碼示例

--建立資料庫mydb和mydb2
--在mydb和mydb2中建立測試表,預設是dbo這個schema
CREATE TABLE DEPT
       (DEPTNO int primary key,
        DNAME VARCHAR(14),
        LOC VARCHAR(13) );

--插入資料
INSERT INTO DEPT VALUES (101, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (201, 'RESEARCH',   'DALLAS');
INSERT INTO DEPT VALUES (301, 'SALES',      'CHICAGO');
INSERT INTO DEPT VALUES (401, 'OPERATIONS', 'BOSTON');

--檢視資料庫schema, user 的儲存過程
select * from sys.database_principals
select * from sys.schemas 
select * from sys.server_principals

--建立登陸帳戶(create login)
create login dba with password='[email protected]', default_database=mydb

--為登陸賬戶建立資料庫使用者(create user),在mydb資料庫中的security中的user下可以找到新建立的dba
create user dba for login dba with default_schema=dbo

--通過加入資料庫角色,賦予資料庫使用者“db_owner”許可權
exec sp_addrolemember 'db_owner', 'dba'
--讓 SQL Server 登陸帳戶“dba”訪問多個數據庫
use mydb2
go create user dba for login dba with default_schema=dbo
go exec sp_addrolemember 'db_owner', 'dba'go
--禁用登陸帳戶
alter login dba disable
--啟用登陸帳戶
alter login dba enable
--登陸帳戶改名
alter login dba with name=dba_tom
--登陸帳戶改密碼: 
alter login dba with password='[email protected]'
--資料庫使用者改名: 
alter user dba with name=dba_tom
--更改資料庫使用者 defult_schema: 
alter user dba with default_schema=sales
--刪除資料庫使用者: 
drop user dba
--刪除 SQL Server登陸帳戶: 
drop login dba

使用儲存過程來完成使用者建立

下面一個例項來說明在sqlserver中如何使用儲存過程建立角色,重建登入,以及如何為登入授權等問題。

/*--示例說明
        示例在資料庫InsideTSQL2008中建立一個擁有表HR.Employees的所有許可權、擁有表Sales.Orders的SELECT許可權的角色r_test
    隨後建立了一個登入l_test,然後在資料庫InsideTSQL2008中為登入l_test建立了使用者賬戶u_test
    同時將使用者賬戶u_test新增到角色r_test中,使其通過許可權繼承獲取了與角色r_test一樣的許可權
    最後使用DENY語句拒絕了使用者賬戶u_test對錶HR.Employees的SELECT許可權。
    經過這樣的處理,使用l_test登入SQL Server例項後,它只具有表Sales.Orders的select許可權和對錶HR.Employees出select外的所有許可權。
--*/


USE InsideTSQL2008

--建立角色 r_test
EXEC sp_addrole 'r_test'

--新增登入 l_test,設定密碼為pwd,預設資料庫為pubs
EXEC sp_addlogin 'l_test','[email protected]','InsideTSQL2008'

--為登入 l_test 在資料庫 pubs 中新增安全賬戶 u_test
EXEC sp_grantdbaccess 'l_test','u_test'

--新增 u_test 為角色 r_test 的成員
EXEC sp_addrolemember 'r_test','u_test'


--用l_test登陸,發現在SSMS中找不到仍和表,因此執行下述兩條語句出錯。
select * from Sales.Orders
select * from HR.Employees

--授予角色 r_test 對 HR.Employees 表的所有許可權
GRANT ALL ON HR.Employees TO r_test
--The ALL permission is deprecated and maintained only for compatibility. 
--It DOES NOT imply ALL permissions defined on the entity.
--ALL 許可權已不再推薦使用,並且只保留用於相容性目的。它並不表示對實體定義了 ALL 許可權。

--測試可以查詢表HR.Employees,但是Sales.Orders無法查詢
select * from HR.Employees


--如果要收回許可權,可以使用如下語句。(可選擇執行)
revoke all on HR.Employees from r_test
--ALL 許可權已不再推薦使用,並且只保留用於相容性目的。它並不表示對實體定義了 ALL 許可權。


--授予角色 r_test 對 Sales.Orders 表的 SELECT 許可權
GRANT SELECT ON Sales.Orders TO r_test

--用l_test登陸,發現可以查詢Sales.Orders和HR.Employees兩張表
select * from Sales.Orders
select * from HR.Employees

--拒絕安全賬戶 u_test 對 HR.Employees 表的 SELECT 許可權
DENY SELECT ON HR.Employees TO u_test

--再次執行查詢HR.Employees表的語句,提示:拒絕了對物件 'Employees' (資料庫 'InsideTSQL2008',架構 'HR')的 SELECT 許可權。
select * from HR.Employees

--重新授權
GRANT SELECT ON HR.Employees TO u_test

--再次查詢,可以查詢出結果。
select * from HR.Employees


USE InsideTSQL2008
--從資料庫中刪除安全賬戶,failed
EXEC sp_revokedbaccess 'u_test'
--刪除角色 r_test,failed
EXEC sp_droprole 'r_test'
--刪除登入 l_test,success
EXEC sp_droplogin 'l_test'

revoke 與 deny的區別

revoke:收回之前被授予的許可權

deny:拒絕給當前資料庫內的安全帳戶授予許可權並防止安全帳戶通過其組或角色成員資格繼承許可權。比如UserA所在的角色組有inset許可權,但是我們Deny UserA使其沒有insert許可權,那麼以後即使UserA再怎麼到其他含有Insert的角色組中去,還是沒有insert許可權,除非該使用者被顯示授權。

簡單來說,deny就是將來都不許給,revoke就是收回已經給予的。

例項

GRANT INSERT ON TableA TO RoleA
GO
EXEC sp_addrolemember RoleA, 'UserA' -- 使用者UserA將有TableA的INSERT許可權
GO

REVOKE INSERT ON TableA FROM RoleA -- 使用者UserA將沒有TableA的INSERT許可權,收回許可權
GO

GRANT INSERT ON TableA TORoleA --重新給RoleA以TableA的INSERT許可權
GO 

DENY INSERT ON TableA TO UserA -- 雖然使用者UserA所在RoleA有TableA的INSERT許可權,但UserA本身被DENY了,所以使用者UserA將沒有TableA的INSERT許可權。


相關推薦

SQL Server建立使用者角色授權

要想成功訪問 SQL Server 資料庫中的資料, 我們需要兩個方面的授權: 獲得准許連線 SQL Server 伺服器的權利;獲得訪問特定資料庫中資料的權利(select, update, delete, create table ...)。 假設,我們準備建立一個

SQL Server建立使用者角色授權(使用SQL語句)

要想成功訪問 SQL Server 資料庫中的資料, 我們需要兩個方面的授權: 獲得准許連線 SQL Server 伺服器的權利;獲得訪問特定資料庫中資料的權利(select, update, delete, create table ...)。 假設,我們準備建立一個

SQL Server的鎖類型用法

兩個 註意 超時設置 date 帶來 原因 不更新數據 自己 col 一. 為什麽要引入鎖 多個用戶同時對數據庫的並發操作時會帶來以下數據不一致的問題: 丟失更新 A,B兩個用戶讀同一數據並進行修改,其中一個用戶的修改結果破壞了另一個修改的結果,比如訂票系統 臟讀 A用戶修

轉:SQL Server服務器角色和數據庫角色權限詳解

ice 擁有 錯誤 update ini 語法 remote login spl 當幾個用戶需要在某個特定的數據庫中執行類似的動作時(這裏沒有相應的Windows用戶組),就可以向該數據庫中添加一個角色(role)。數據庫角色指定了可以訪問相同數據庫對象的一組數據庫用戶。數

sql serverindex的REBUILD和REORGANIZE的區別工作方式 sql serverindex的REBUILD和REORGANIZE

sql server中index的REBUILD和REORGANIZE 轉自:https://www.cnblogs.com/flysun0311/archive/2013/12/05/3459451.html   參考文獻: http://technet.micro

SQL Server通用資料庫角色許可權的處理詳解

SQL Server中通用資料庫角色許可權的處理詳解 前言 安全性是所有資料庫管理系統的一個重要特徵。理解安全性問題是理解資料庫管理系統安全性機制的前提。 最近和同事在做資料庫許可權清理的事情,主要是刪除一些賬號;取消一些賬號的較大的許可權等,例如,有一些有db_owner許可權,我們取消賬號的資料庫角

SQL Server分離附加資料生成SQL指令碼

    一:分離 1.首先開啟SQL Server  2.選中要分離的使用者資料庫(此處以SchoolDB)做為示例 3.右鍵單擊(任務-----分離)    4.選中"刪除連線","更新統計資訊",然後點選確定,分離成功之後資料庫就

使用Setup Factory 打包軟體,安裝時自動建立資料庫資料庫的表(效果類似sql server的附加資料庫操作)

前提:已安裝Setup Fatory軟體、我使用的是 安裝工廠永樂漢化版,需要的請自行下載安裝 下面只列出關鍵性步驟,黃色字型較為關鍵,是一個出錯點   步驟一(關鍵):生成資料庫備份檔案,以及建表sql指令碼,和bat命令檔案 備份資料庫,生成檔案1,.bak檔

SQL Server通用資料庫角色許可權處理

--==================================================================================================================--        ScriptName            :      

SQL Server伺服器身份驗證使用者登入

安裝過程中,SQL Server 資料庫引擎設定為“Windows 身份驗證模式”或“SQL Server 和 Windows 身份驗證模式”。 安裝完成後,您可以隨時更改身份驗證模式。 如果在安裝過程中選擇了“Windows 身份驗證模式”,則 sa 登入名將被禁用

sql server的一些角色,命令,函式的講解

今天悲劇了,把資料庫中的使用者設定成了db_denydatareader角色,沒有sa的密碼,找了好久。可以使用系統儲存過程將使用者從中移除 exec sp_droprolemember 'db_denydatareader', 'Mssql_NLTS'; 為便於管理資

SQL Server"登陸名"-"使用者對映"-"資料庫角色成員身份"下面10個可選項的意思

  public 維護所有預設許可權 db_owner 執行所有資料庫角色活動 db_accessadmin 新增和刪除資料庫使用者, 組及角色 db_ddladmin 新增、更改或刪除資料庫物件 db_security admin 分配語句執行和物件許可權 db_bac

SQL Server 建立應用程式角色

應用程式角色可提供對應用程式(而不是資料庫角色或使用者)分配許可權的方法。使用者可以連線到資料庫、啟用應用程式角色以及採用授予應用程式的許可權。授予應用程式角色的許可權在連線期間有效。 安全說明 當客戶端應用程式在連線字串中提供應用程式角色名稱和密碼時,可啟用應用程式角

sql server利用sql語句建立使用者和角色

核心提示:建立角色,使用者,許可權示例在資料庫pubs中建立一個擁有表jobs的所有許可權、擁有表titles的SELECT許可權的角色p_test隨後建立了一個登入a_test,然後在資料庫pubs中為登入a_test建立了使用者賬戶m_test同時將使用者賬戶m_t...

SQL Server 的伺服器和資料庫角色分配

伺服器角色:按照從最低級別角色(bulkadmin)到最高級別角色(sysadmin)的順序進行描述:1.bulkadmin:這個角色可以執行BULK INSERT語句.該語句允許從文字檔案中將資料匯入到SQL Server2008資料庫中,為需要執行大容量插入到資料庫的域帳

VBS將本地的Excel數據導入到SQL Server

vbs將本地的excel數據導入到sql server中 VBS將本地的Excel數據導入到SQL Server中最近有個測試,需要將本地的Excel數據導入到SQL Server中,所以就寫了一個這個腳本,供有需要的同學進行參考。因為在此演示測試,所以準備的數據都比較簡單。我們準備將本地的Excel的A列插

SQL Server的事務與鎖

ani 否則 編譯 什麽 高並發 設置時間 檢測 isolation 管理 了解事務和鎖 事務:保持邏輯數據一致性與可恢復性,必不可少的利器。 鎖:多用戶訪問同一數據庫資源時,對訪問的先後次序權限管理的一種機制,沒有他事務或許將會一塌糊塗,不能保證數據的安全正確讀寫。 死鎖

sql server的全局變量,常用的沒有多少...以後看看就行

detail 技術分享 服務 @* version 變量 名稱 tail identity 全局變量格式: @@***   這些變量有系統維護,不需要我們自己定義,一般都是用來查看信息。 在存儲過程中 用得最多的 @@error,判斷有沒有錯誤信息。 一、@@versio

sql server的開窗函數over、視圖、事物

sel 開啟 row 分數 over 兩個 color span art 一、開窗函數over的作用有兩個: 1、排序order by,row_number,翻頁 2、劃區partition by,結合聚合函數針對某部分數據進行匯總 翻頁的sql server 語句: s

SQL Server 函數的理解總結

處理 操作 標量 之間 div 方式 再看 sel 聚合 T-SQL語言為我們提供了更加靈活的方式操作數據,那就是函數,函數總的分為三大類:標量函數:(傳入一個參數,再傳出一個參數)聚合函數(傳入多個參數,傳出一個參數),表值函數(傳入一個結果集對象,讓我們能夠通過對表的操