1. 程式人生 > >SQL 使用者許可權(表、函式、儲存過程等)---收藏

SQL 使用者許可權(表、函式、儲存過程等)---收藏

對資料的訪問是通過SQL Server 2008的許可權層次結構進行管理的。可以通過GRANT、DENY和REVOKE語句來管理這個許可權層次結構。

       GRANT:允許一個數據庫使用者或角色執行所授許可權指定的操作。

       DENY:拒絕一個數據庫使用者或角色的特定許可權,並且阻止它們從其他角色中繼承這個許可權。

       REVOKE:取消先前被授予或拒絕的許可權。

5.5.1  管理對SQL Server例項和資料庫的訪問

1. 控制登入操作

SQL Server 2008提供了一個精細的許可權結構,能夠更出色地控制登入操作。可以通過GRANT、DENY和REVOKE語句來控制權限,通過sys.Server_permissions目錄檢視來獲取有關服務許可權的資訊。

如下語句將為登入名Marylogin授予建立和執行SQL Server Profiler跟蹤的許可權:

GRANT ALTER TRACE TO Marylogin;

使用者可以通過使用fn_my_permissions函式來了解自己的許可權。如下語句將顯示使用者的許可權:

SELECT * FROM fn_my_permissions (NULL, 'SERVER');

2. 為資料庫角色授予許可權

除了使用固定資料庫角色之外,還可以為資料庫角色授予小粒度的資料庫許可權。下面的語句將為資料庫使用者Peteruse授予BACKUP DATABASE(備份資料庫)許可權:

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Grant permissions to the database user Peteruse

-- to backup the database 例項資料庫.

GRANT BACKUP DATABASE TO Peteruse;

5.5.2  管理對錶和列的訪問

1. 更改對錶的訪問

使用者對錶所擁有的有效許可權控制著使用者對錶的訪問行為。可以通過管理表的許可權來控制資料庫使用者對錶的訪問。如表5-4所示的就是可以管理的表的許可權。可以對資料庫使用者或角色指定這些許可權。

5-4  表的許可權

權    限

描    述

ALTER

可以更改表屬性

CONTROL

提供所有權之類的許可權

DELETE

可以從表中刪除行

INSERT

可以向表中插入行

REFERENCES

可以通過外來鍵引用其他表

SELECT

可以在表中選擇行

TAKE OWNERSHIP

可以取得表的所有權

UPDATE

可以在表中更新行

VIEW DEFINITION

可以訪問表的元資料

可以使用GRANT語句授權資料庫使用者或者角色對錶的訪問。如下語句將授予使用者Peteruse對錶Adminschema.Student的SELECT、INSERT和UPDATE許可權:

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Grant some permissions to Peteruse on the Adminschema.Student table.

GRANT SELECT,INSERT,UPDATE

ON Adminschema.Student

TO Peteruse;

限制對錶的訪問,有兩種不同的情況。如果已經為使用者授予了表的這種許可權,則應該使用REVOKE語句清除之前授予的許可權。示例如下:

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Revoke SELECT permissions from Peteruse on the Adminschema.Student table

REVOKE SELECT

ON Adminschema.Student

TO Peteruse;

然而,如果使用者隸屬於某個具備此許可權的角色,則使用者可能依然具備通過REVOKE語句取消的許可權。在這種情況下,需要使用DENY語句來拒絕該使用者的訪問。示例如下:

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Deny DELETE permission to Peteruse on the Adminschema.Student table,

-- regardless of what permissions this user might

-- inherit from roles.

DENY DELETE

ON Adminschema.Student

TO Peteruse;

2. 提供對列的單獨訪問

SQL Server 2008提供了授予或拒絕訪問單獨列的許可權,這個特性提供了靈活的拒絕訪問機制,例如,保護某些列上的機密資料。如表5-5所示的是可以管理的列許可權。

5-5  列許可權

權    限

描    述

SELECT

可以選擇列

UPDATE

可以更新列

REFERENCE

可以通過外來鍵引用列

授權對列的訪問,也使用GRANT語句。以下示例為Peteruse使用者授予了在表Adminschema.Student的StudentDate和ClientID列上SELECT和UPDATE的許可權。

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Grant SELECT and UPDATE permissions to Peteruse

-- on some specific columns of the Adminschema.Student table

GRANT SELECT,UPDATE (

StudentDate,

ClientID)

ON Adminschema.Student

TO Peteruse;

取消對列的訪問授權,與取消對錶的訪問授權類似,可以使用REVOKE語句來實現,但如果要阻止一個使用者獲得某種許可權,則需要使用DENY語句。

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Revoke previosly granted or denied permissions

-- from Peteruse on the StudentDate column.

REVOKE UPDATE (StudentDate)

ON Adminschema.Student

TO Peteruse;

5.5.3  管理對可程式設計物件的訪問

可程式設計物件,如儲存過程及使用者定義的函式,具有自己的安全上下文。資料庫使用者需要獲得授權才能執行儲存過程、函式和程式集。一旦資料庫引擎檢查了執行可程式設計物件的許可權,就會在可程式設計物件內部對其所執行的操作進行許可權檢查。當資料庫物件按順序相互訪問時,該訪問順序將形成一個所有權鏈。

1. 管理儲存過程的安全性

在各種資料庫物件中,儲存過程是資料庫開發人員最常使用的資料庫物件。與其他資料庫物件一樣,儲存過程也是需要保護的物件。使用者需要具備執行操作的許可權,就像建立一個儲存過程一樣,使用者需要具備相應的許可權來執行一個儲存過程。如表5-6所示是可以為儲存過程授予的許可權。

5-6  儲存過程許可權

權    限

描    述

ALTER

可以更改儲存過程屬性

CONTROL

可以提供所有權之類的許可權

EXECUTE

可以執行儲存過程

TAKE OWNERSHIP

可以取得儲存過程的所有權

VIEW DEFINITION

可以檢視儲存過程的元資料

在執行一個儲存過程時,SQL Server會檢查當前資料庫使用者是否具有該儲存過程的EXECUTE許可權。下面的語句將為資料庫使用者Peteruse 授予儲存過程dbo.uspGetBillOfMaterials的EXECUTE許可權:

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Grant EXECUTE permission to Peteruse on a stored procedure.

GRANT EXECUTE On dbo.uspGetBillOfMaterials

TO Peteruse;

同樣地,如果要阻止一個使用者執行某個儲存過程,可以取消或者拒絕該使用者的EXECUTE許可權。

2. 管理使用者定義函式的安全性

使用者定義函式和儲存過程一樣,也是可程式設計物件。主要存在兩種型別的使用者定義函式:只返回單一值的標量函式和返回一個表資料型別值的表值函式。根據使用者定義函式型別的不同,可以對函式授予EXECUTE或SELECT許可權,如表5-7所示。

5-7  使用者定義函式許可權

權    限

描    述

ALTER

可以更改函式屬性

CONTROL

可以提供所有權之類的許可權

TAKE OWNERSHIP

可以取得函式的所有權

VIEW DEFINITION

可以檢視函式的元資料

SELECT

可以選擇表值函式所返回的資料(只對表值函式有效)

EXECUTE

可以執行使用者定義函式(只對標量函式有效)

對於執行表值函式,SQL Server將檢查使用者是否擁有此函式所返回的表的SELECT許可權。可以採用與為表授予SELECT許可權相同的方式來為表值函式授予SELECT許可權。如下語句將授予資料庫使用者Peteruse對使用者定義函式dbo.ufnGetContactInformation的SELECT許可權:

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Grant permission to Peteruse to execute a user defined function.

GRANT SELECT ON dbo.ufnGetContactInformation

TO Peteruse;

注意:

表值函式還有另外一種型別,叫做行內函數。行內函數在功能上等同於檢視,但是它支援引數。從安全形度來講,這種型別的函式等同於檢視。

對於執行標量函式,資料庫使用者需要在函式上具備EXECUTE許可權。可以採用與為儲存過程授予EXECUTE許可權相同的方式來為標量函式授予EXECUTE許可權。如下語句將授予資料庫使用者Peteruse對使用者定義函式dbo.ufnGetContactInformation的EXECUTE許可權:

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Grant Peteruse permission to execute a user defined function.

GRANT EXECUTE ON dbo.ufnGetStock

TO Peteruse;

3. 管理程式集的安全性

SQL Server 2008提供了在資料庫引擎內部包含.NET程式集(引用.dll檔案的物件),並在儲存過程及函式中呼叫這些程式集的能力。可以為程式集分配與儲存過程一樣的許可權,這些許可權如表5-6所示。

(1) 許可權集

建立一個程式集時,需要指定一個許可權集。許可權集指定了程式集在SQL Server中所授予的一個程式碼訪問許可權的集合。許可權集具有如下3種不同的型別。

       SAFE型別:程式集執行的程式碼不能訪問外部系統資源。SAFE型別是最受限制的許可權集合,並且是預設的型別。

       EXTERNAL_ACCESS型別:程式集可以訪問外部系統資源。

       UNSAFE型別:程式集可以執行非託管程式碼。

對於不需要訪問外部資源的程式集,推薦使用SAFE型別的許可權集。

(2) 執行一個程式集

當一個應用程式嘗試訪問程式集中的物件時,資料庫引擎會檢查當前使用者是否具有該程式集的EXECUTE許可權。如下語句將授予資料庫使用者Peteruse對程式集的EXECUTE許可權:

-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Grant Peteruse permission to execute an assembly.

GRANT EXECUTE ON <AssemblyName>

TO Peteruse;

通過為一個程式集授予EXECUTE許可權,可以為資料庫使用者授予對程式集中所有物件的EXECUTE許可權。

4. 管理所有權鏈

所有權鏈是資料物件互相訪問的順序。例如,在一個儲存過程中,向一個表中插入一行資料,儲存過程稱為呼叫物件,表稱為被呼叫物件。SQL Server遍歷這個鏈中的連結時,與單獨訪問資料庫物件時的方式不同,資料庫引擎會以另一種方式評估對物件的訪問許可權。

在一個鏈中訪問物件時,SQL Server首先會比較物件的所有者與呼叫物件的所有者。如果兩個物件的所有者相同,則不評估被引用物件的許可權。這個特性對管理物件許可權非常有用。例如,假設資料庫使用者Peteruse建立了一個名稱為Person.SupplierContacts的表,並在一個名稱為Person.InsertSupplierContacts的儲存過程中向PersonSupplierContacts表中插入了行。由於這兩個資料物件具有同樣的所有者Peteruse,因此,只需授予其他使用者對儲存過程Person.InsertSupplier- Contacts的EXECUTE許可權,以允許其他使用者在訪問表PersonSupplierContacts時,依然具有EXECUTE許可權。

注意:

所有權鏈提供了一種強大的封裝演算法。一個數據可以被設計成只通過充分文件化的公共介面(例如儲存過程和使用者定義函式)來對外提供資料訪問,這些儲存過程和使用者定義函式隱藏了資料設計實現的複雜性。資料庫開發人員可以充分利用所有權鏈,在拒絕所有使用者對資料庫中所有表的訪問的同時,仍然可以允許其訪問資料。

5. 管理執行上下文

執行上下文由連線到相應會話的使用者、登入名或者由執行(呼叫)相應模組的使用者或登入名確定。在SQL Server 2008進行物件許可權檢查時,登入名和使用者令牌為其提供了所需的資訊。在SQL Server 2008中,可以使用EXECUTE AS語句來更改執行上下文。這一操作稱為切換執行上下文。

(1) 執行EXECUTE AS

EXECUTE AS語句允許顯式地定義當前連線的執行上下文。可以用EXECUTE AS更改當前連線的登入名或者資料庫使用者。上下文的變化在另一個上下文變更發生前、連線關閉前或者一個REVERT語句執行前始終是有效的。如下語句使用了EXECUTE AS語句為資料庫使用者Peteruse更改執行上下文:

z-- Change the connection context to the database 例項資料庫.

USE 例項資料庫;

GO

-- Change the execution context to the user Peteruse.

EXECUTE AS USER=' Peteruse ';

-- The following statement will be executed under Peteruse 's credentials.

TRUNCATE TABLE dbo.ErrorLog;

由於使用者Peteruse沒有truncate表的許可權,因此,上述程式碼將會產生一個錯誤。而去下truncate表的語句則能成功執行:

-- Change the execution context back to the original state

REVERT;

-- Now the following statement will be executed under

-- the original execution context.

TRUNCATE TABLE dbo.ErrorLog;

(2) 管理上下文切換

除了控制批處理(批處理是包含一個或多個Transact-SQL語句的組,這個組從應用程式一次性地傳送到SQL Server執行,就像前面的TRUNCATE TABLE示例一樣)的執行上下文,還可以控制儲存過程和使用者定義函式的執行上下文。在這些模組中切換上下文時,可以控制在這些儲存過程或者函式中使用哪個使用者帳戶來訪問它所引用的資料庫物件。為此,只需要對EXECUTE AS語句進行如下改動即可。

       CALLER:儲存過程或者使用者定義函式內的語句都在模組呼叫者的上下文中執行。

       SELF:所有語句在建立或者更改儲存過程或者使用者定義函式的使用者的上下文中執行。

       OWNER:所有語句在儲存過程或者使用者定義函式的當前所有者的上下文中執行。

       <User>:所有語句在指定資料庫使用者或者登入名的上下文中執行。

以下示例將切換上下文到資料庫使用者dbo的上下文中以建立一個儲存過程。然後,為資料庫使用者Peteruse授予這個新建儲存過程的EXECUTE許可權,並更改上下文以測試儲存過程的執行:

-- Create a stored procedure to execute statements

-- as dbo.

CREATE PROCEDURE dbo.usp_TruncateErrorLog

    WITH EXECUTE AS 'dbo'

    AS

    TRUNCATE TABLE dbo.ErrorLog;

GO

-- Grant permissions to execute this procedure to Peteruse.

GRANT EXECUTE ON dbo.usp_TruncateErrorLog TO Peteruse

-- Change the execution context of this batch to Peteruse.

EXECUTE AS [USER=]'Peteruse'

-- Execute the stored procedure.

EXECUTE dbo.usp_TruncateErrorLog

由此可見,在不能通過授權來使使用者執行某些操作時,尤其適合使用上下文切換。

相關推薦

SQL 使用者許可權函式儲存過程---收藏

對資料的訪問是通過SQL Server 2008的許可權層次結構進行管理的。可以通過GRANT、DENY和REVOKE語句來管理這個許可權層次結構。 ●       GRANT:允許一個數據庫使用者或角色執行所授許可權指定的操作。 ●       DENY:拒絕一個數據庫使用者或角色的特定許可權,並且阻止它

My SQL筆記一的建立修改刪除

1 表的建立、修改及刪除 分別說明MySQL資料庫中表在建立、修改和刪除過程中的各種操作和約束處理。 建立表 CREAT TABEL IF NOT EXISTS “tabel_name”(column_name  column_type); 設定主鍵 分單欄位

SQL的綜合案例觸發器函式遊標儲存過程

下面是一個學生資訊的建立 在這裡就不建立資料庫了 CREATE TABLE CLASS ( class_id int IDENTITY PRIMARY KEY, --班級ID class_name Varchar(50), --班級名稱 cla

SQL函式:判斷庫儲存過程是否存在

----------------- 庫是否存在if exists(select * from master..sysdatabases where name=N'庫名')print 'exists'elseprint 'not exists'----------------- 判斷要建立的表名是否存在if e

JavaScript正則表示式單驗證郵箱驗證函式HTML DOM

正則表示式 1.定義:它是由一個字元序列形成的搜尋模式,當在文字中搜索資料時,可以用搜索模式來描述你要查詢的內容。它可以是一個簡單的字元,或一個更復雜的模式。它可用於所有文字搜尋和文字替換操作。 2.Eg:var patt = /youngamber/i

go語言初體驗流程控制range遍歷函式結構體面向物件

一、流程控制 // main package main import ( "fmt" ) func main() { x := 2 switch x { case 1: fmt.Print("beifeng 1") case 2:

C/C++ 指標小結——指標與其它資料型別陣列字串函式結構體的關係

一、指標與陣列和字串 1、指標與陣列 當宣告數時,編譯器在連續的記憶體空間分配基本地址和足夠的儲存空間,以容納陣列的所有元素。基本地址是陣列第一個元素(索引為0)的儲存位置。編譯器還把陣列名定義為指向第一個元素的常量指標。 元素的地址是通過索引和資料型別的比例因子來計算的;例如: x[3

Python自動化學習筆記——Python資料型別集合set,元組tuple修改檔案函式random常用方法

1.修改檔案的兩種方式 1 #第一種 2 with open('users','a+') as fw: #用a+模式開啟檔案,使用with這種語法可以防止忘記close檔案 3 fw.seek(0) #移動檔案指標到最前面,然後才能讀到內容 4 result=fw.read()

CS231python課程——基礎列表字典元組集合函式

文章目錄 基礎 列表list 字典dict 集合set 元組tuple:不可修改的有序列表 函式 類 基礎 列表list #如果想要在迴圈體內訪問每個元素的指標,可以使用內建的enumerate函式 an

Oracle刪除當前使用者下的所有檢視序列函式儲存過程包(轉)

最近在用oracle,發現了一個批量刪除資料庫中的各種結構的好方法。 --delete tables  select 'drop table ' ||&

Java基礎篇--- 資料型別函式控制符

基本資料型別 1.整數型別: byte(1 位元組 ), short(2 位元組 ), int(4 位元組 ), long(8 位元組 ) 1位元組=8位,而每一個數的第一位為符號位,並且-0(負零)用-128表示,所以byte的範圍為:-2^(位元組8-1) --> 2^(位元組

JavaScript基礎總結深入資料型別資料_變數_記憶體物件函式回撥函式this

資料型別 1、分類 JavaScript 資料型別分為兩大類,分別為:基本型別,又稱為值型別;物件型別,又稱為引用型別。 基本(值)型別 String:任意字元 Number:任意的數字 boolean: true/false undefined: undefi

MySql:SQL常用操作函式事物和索引

MySQL是一個關係型資料庫管理系統,在開始學習MySQL資料庫前,讓我們先了解下RDBMS的一些術語: 資料庫: 資料庫是一些關聯表的集合。 資料表: 表是資料的矩陣,在一個數據庫中的表看起來像一個簡單的電子表格。 列:一列(資料元素) 包含了相同的資料,例如郵政編碼

sql 查詢兩張結構差異兩張結構相同的資料差異

*1.比較表結構 *: (select column_name,table_name from user_tab_columns where table_name = ‘EMP’ minus select column_name,table_name from

pl/sql程式設計---過程函式

1.註釋 單行註釋 -- select * from emp where empno=7788; --取得員工資訊 多行註釋 /*...*/來劃分 2.標誌符號的命名規範 1).當定義變數時,建議用v_作為字首v_sal 2).當定義常量時,建議用c_作為字首c_rate 3

宣告定義區別變數函式

相同點 對編譯器來說都是符號,宣告就會在符合表中留下一列等待填充的空白,即不完整的等待填充一行,而定義就是符合表中完整的一行。在編譯cpp成obj時,這裡面變數、函式和類三種東西看成並列地位,即都是一個名字,符號表中的一列(可以先簡單認為obj的符號表中只有兩列即符號名字和地址) 不

檢視儲存過程函式觸發器事件

儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。儲存過程是資料庫中的一個重要物件,任何一個設計良好的資料庫應用程式都應該用到儲存過程。函式l過程不必返回值l函式必須返回值l過程可

子程式過程函式方法

一般程式設計語言包含兩種基本的抽象:過程抽象和資料抽象。過程抽象有時也稱控制抽象。 子程式在1950年以前就發明了,作為一種抽象那時候並未被完全接受。相反,最初它被看做是一種節省程式碼的機制,但很快子程式就被認可為過程抽象的一種方式。意識到子程式可以作為一種抽象機制

HTML的筆記及展示2單元素input元素labelbutton以及HTML5新增的一些元素

一、HTML原有的表單與表單控制元件 1.****<form…/>元素用於生成輸入表單,該元素不會生成視覺化部分。如單行文字框、多行文字框、單選按鈕、複選框等都需要放在<form…/>元素內 form元素的重要屬性: action:指定當單擊表單內的"確認"按鈕時

Python入門 第三天set函式切片迭代列表生成式

Python中什麼是set dict的作用是建立一組 key 和一組 value 的對映關係,dict的key是不能重複的。 有的時候,我們只想要 dict 的 key,不關心 key 對應的 value,目的就是保證這個集合的元素不會重複,這時,set就派上用場了。