自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

修改SQL Server 2005數(shù)據(jù)庫(kù)執(zhí)行環(huán)境

數(shù)據(jù)庫(kù) SQL Server
我們今天是要和大家一起探討的是正確修改SQL Server 2005數(shù)據(jù)庫(kù)執(zhí)行環(huán)境,以下就是文章的詳細(xì)內(nèi)容的講述,望大家有所收獲。

下面的文章主要介紹的是正確修改SQL Server 2005數(shù)據(jù)庫(kù)執(zhí)行環(huán)境,我們大家都知道執(zhí)行環(huán)境是SQL Server數(shù)據(jù)庫(kù)中設(shè)定用戶權(quán)限的認(rèn)證方式,區(qū)中包括,當(dāng)您登錄到SQL Server的時(shí)候,登錄賬戶就被賦予了一定的權(quán)限。

其中可能包括登錄的功能、訪問數(shù)據(jù)庫(kù)以及在數(shù)據(jù)庫(kù)中執(zhí)行某些操作的功能。

SQL Server 2005包含了EXECUTE AS語(yǔ)句,通過使用EXECUTE AS語(yǔ)句,您可以為批處理和過程轉(zhuǎn)換執(zhí)行環(huán)境,這樣,調(diào)用該批處理或過程的用戶就可以使用不同的權(quán)限來操作了。

所有權(quán)鏈

在我正式講解SQL Server 2005中執(zhí)行環(huán)境的問題之前,先來簡(jiǎn)單地說說所有權(quán)鏈的工作原理。

當(dāng)用戶執(zhí)行一個(gè)存儲(chǔ)過程的時(shí)候(假定該用戶擁有執(zhí)行該存儲(chǔ)過程的權(quán)限),SQL Server將該存儲(chǔ)過程的所有者與這個(gè)存儲(chǔ)過程所涉及到的對(duì)象的所有者進(jìn)行對(duì)比,如果他們的所有者相同,那么就不必對(duì)這些引用對(duì)象的權(quán)限進(jìn)行評(píng)估了。

所以,如果用戶Tim獲得了存儲(chǔ)過程usp_ProcedureChain的權(quán)限,而usp_ProcedureChain存儲(chǔ)過程的所有者是dbo,那么,如果dbo還同時(shí)擁有usp_ProcedureChain所調(diào)用的其他存儲(chǔ)過程,那么Tim在執(zhí)行這個(gè)存儲(chǔ)過程的時(shí)候就不會(huì)出現(xiàn)錯(cuò)誤。

執(zhí)行環(huán)境的轉(zhuǎn)換

在SQL Server 2000中,您可以使用SETUSER命令來模擬SQL用戶的執(zhí)行環(huán)境,但問題在于,只有系統(tǒng)管理員或者數(shù)據(jù)庫(kù)的所有者才能使用這個(gè)命令,而且Windows賬戶也不能使用該命令。

在SQL Server 2005中,EXECUTE AS語(yǔ)句可以替代SETUSER來改變存儲(chǔ)過程、觸發(fā)器、批處理或者函數(shù)的執(zhí)行環(huán)境。如果執(zhí)行環(huán)境變成了另外一個(gè)用戶,那么SQL Server將檢查該用戶的權(quán)限。如果您需要在創(chuàng)建或修改一個(gè)存儲(chǔ)過程或函數(shù)的時(shí)候指定EXECUTE AS語(yǔ)句,您需要具備IMPERSONATE的權(quán)限,以及創(chuàng)建該對(duì)象的權(quán)限。

實(shí)例

正如我剛才所介紹的一樣,改變存儲(chǔ)過程的執(zhí)行環(huán)境非常有用,接下來我將通過實(shí)例來講解如何實(shí)現(xiàn)這一功能。在這個(gè)例子中,您會(huì)看到如何使用EXECUTE AS將沒有確切權(quán)限的使用者模擬為所有者對(duì)表格進(jìn)行插入操作。

在***行語(yǔ)句中,我使用了REVERT命令,這樣,您就可以完整地返回到例子中,而不必?fù)?dān)心需要清除任何對(duì)象。

 

 

  1. REVERT  
  2. GO  

 

 

在下面的代碼的第七行,我使用了清除語(yǔ)句,這樣可以檢查我在隨后的例子中要使用的對(duì)象是否已經(jīng)存在,如果已經(jīng)存在,就將其清除。

 

 

 

  1. IF OBJECT_ID('usp_InsertMyTable','P')>0  
  2. DROP PROCEDURE usp_InsertMyTable  
  3. GO  
  4. IF OBJECT_ID('TableOwnerSchema.MyTable','U')>0  
  5. DROP TABLE TableOwnerSchema.MyTable  
  6. GO  
  7. IF EXISTS  
  8. (SELECT * FROM sys.schemas WHERE name = N'TableOwnerSchema')  
  9. DROP SCHEMA [TableOwnerSchema]  
  10. IF EXISTS  
  11. (SELECT * FROM sys.database_principals WHERE name = N'BaseUser')  
  12. DROP USER BaseUser  
  13. IF EXISTS  
  14. (SELECT * FROM sys.server_principals WHERE name = N'BaseUser')  
  15. DROP LOGIN BaseUser  
  16. IF EXISTS  
  17. (SELECT * FROM sys.database_principals WHERE name = N'TableOwner')  
  18. DROP USER TableOwner  
  19. IF EXISTS  
  20. (SELECT * FROM sys.server_principals WHERE name = N'TableOwner')  
  21. DROP LOGIN TableOwner  

 

 

以下的腳本語(yǔ)句創(chuàng)建了兩個(gè)登錄名和數(shù)據(jù)庫(kù)的用戶賬戶,注意,CHECK_EXPIRATION和CHECK_POLICY語(yǔ)句,這兩條語(yǔ)句是SQL Server 2005中新出現(xiàn)的。這些語(yǔ)句告訴SQL Server不要對(duì)這個(gè)用戶賬戶強(qiáng)制執(zhí)行密碼截止期限策略,同時(shí)也不要進(jìn)行任何類型的密碼策略檢查,對(duì)于強(qiáng)制安全策略而言,這些是非常有效的方法。

 

 

 

  1. CREATE LOGIN [BaseUser] WITH PASSWORD=N'baseuser',  
  2. DEFAULT_DATABASE=[TRS],  
  3. CHECK_EXPIRATION=OFFCHECK_POLICY=OFF 
  4. GO  
  5. CREATE USER [BaseUser] FOR LOGIN [BaseUser]  
  6. GO  
  7. CREATE LOGIN [TableOwner] WITH PASSWORD=N'tableowner',  
  8. DEFAULT_DATABASE=[TRS],  
  9. CHECK_EXPIRATION=OFFCHECK_POLICY=OFF 
  10. GO  
  11. CREATE USER TableOwner FOR LOGIN TableOwner  
  12. GO  

 

 

在SQL Server 2005中,模式不再是和數(shù)據(jù)庫(kù)用戶相同的事情了,對(duì)于所包含的對(duì)象而言,它處于完全不同的名稱空間。用戶和模式的分離是SQL Server 2005中的一大進(jìn)步,這樣做使對(duì)象的所有權(quán)可以分離,而且比SQL Server 2000更易于管理,以下的語(yǔ)句創(chuàng)建了我們將要使用的數(shù)據(jù)庫(kù)模式:

 

 

 

  1. CREATE SCHEMA [TableOwnerSchema] AUTHORIZATION [TableOwner]  
  2. GO  
  3. Now I enable logins so they can be used:  
  4. ALTER LOGIN [TableOwner] ENABLE  
  5. ALTER LOGIN [BaseUser] ENABLE  
  6. GO  
  7. GRANT CREATE TABLE TO TableOwner  
  8. GO  

 

 

首先,我使用了EXECUTE AS命令,我將當(dāng)前的執(zhí)行環(huán)境設(shè)定為TableOwner,在運(yùn)行了這個(gè)命令之后,所有的權(quán)限評(píng)估將以TableOwner運(yùn)行,而以前的系統(tǒng)管理員權(quán)限將不再適用。

 

 

  1. EXECUTE AS USER = 'TableOwner' 
  2. GO  

 

 

運(yùn)行這個(gè)語(yǔ)句就能夠表明現(xiàn)在的執(zhí)行環(huán)境是TableOwner:

 

 

 

  1. SELECT SESSION_USER  
  2. GO  

 

 

這個(gè)腳本將在TableOwnerSchema的模式中創(chuàng)建一個(gè)名為MyTable的表格,因?yàn)槲乙呀?jīng)賦予了該用戶CREATE TABLE 的權(quán)限,所以TableOwner可以執(zhí)行這條語(yǔ)句。

 

 

 

  1. CREATE TABLE TableOwnerSchema.MyTable  
  2. (  
  3. Field1 INT  
  4. )  
  5. GO  

 

 

當(dāng)我運(yùn)行REVERT語(yǔ)句的時(shí)候,可以在執(zhí)行環(huán)境鏈中回退一步,在SQL Server 2005中,執(zhí)行環(huán)境是可以嵌套的,所以如果您在同一個(gè)數(shù)據(jù)庫(kù)連接中有很多用戶在運(yùn)行,您可能需要多次執(zhí)行該語(yǔ)句以返回到原始的登錄環(huán)境。

 

 

 

  1. REVERT  
  2. GO  
  3. SELECT SESSION_USER  
  4. GO  

 

 

現(xiàn)在我要對(duì)新的表格進(jìn)行快速選擇以確認(rèn)它的存在:

 

 

 

  1. SELECT * FROM TableOwnerSchema.MyTable  
  2. GO  

 

 

以下的腳本創(chuàng)建了一個(gè)過程可以插入新的TableOwnerSchema.MyTable表格,注意我在過程定義中使用了WITH EXECUTE AS 'TableOwner'語(yǔ)句,這意味著該過程被執(zhí)行的時(shí)候,它將在TableOwner的執(zhí)行環(huán)境中被執(zhí)行。

 

 

 

  1. CREATE PROCEDURE usp_InsertMyTable  
  2. WITH EXECUTE AS 'TableOwner'  
  3. AS  
  4. BEGIN  
  5. INSERT INTO TableOwnerSchema.MyTable(Field1)VALUES(8)  
  6. END  
  7. GO  

 

 

我還可以將執(zhí)行權(quán)限賦予一個(gè)用戶賬戶,在這種情況下,我使用以前創(chuàng)建的名為BaseUser的用戶。

 

 

 

  1. GRANT EXEC ON usp_InsertMyTable TO BaseUser  
  2. GO  

 

 

接下來,我將執(zhí)行環(huán)境轉(zhuǎn)換為BaseUser并嘗試運(yùn)行存儲(chǔ)過程:

 

 

 

  1. EXECUTE AS USER = 'BaseUser' 
  2. GO  
  3. EXEC usp_InsertMyTable  
  4. GO  

 

 

現(xiàn)在我可以向TableSchema.MyTable表格中添加記錄了,因?yàn)樵谶@個(gè)過程中TableOwner允許我這樣做,而BaseOwner并沒有明確的權(quán)限可以向該表格添加記錄,所以該用戶的任何嘗試都會(huì)導(dǎo)致錯(cuò)誤的發(fā)生。為了演示這個(gè)問題,可以運(yùn)行以下的腳本,該腳本改變了我們剛才的過程,改為運(yùn)行在調(diào)用者的執(zhí)行環(huán)境中。

 

 

 

  1. REVERT  
  2. GO  
  3. ALTER PROCEDURE usp_InsertMyTable  
  4. AS  
  5. BEGIN  
  6. INSERT INTO TableOwnerSchema.MyTable(Field1)VALUES(8)  
  7. END  
  8. GO  
  9. EXECUTE AS USER = 'BaseUser' 
  10. GO  
  11. EXEC usp_InsertMyTable  
  12. GO  
  13. REVERT  

 

 

開發(fā)者和數(shù)據(jù)庫(kù)管理員會(huì)發(fā)現(xiàn)在執(zhí)行修改SQL Server 2005數(shù)據(jù)庫(kù)執(zhí)行環(huán)存儲(chǔ)過程的時(shí)候轉(zhuǎn)換權(quán)限非常有用,尤其是您處理TRUNCATE TABLE語(yǔ)句的時(shí)候,這個(gè)方法能幫上大忙,因?yàn)門RUNCATE TABLE并沒有可以指定的權(quán)限。您可以將權(quán)限賦予將要進(jìn)行截取表格操作的用戶,然后在操作結(jié)束的時(shí)候再將原有的權(quán)限設(shè)定恢復(fù)就可以了。

 

【編輯推薦】

  1. 三種SQL Server 恢復(fù)模式的比較
  2. 造成SQL Server查詢速度慢的10種原因
  3. SQL Server 分布式數(shù)據(jù)庫(kù)的2種不同系統(tǒng)
  4. SQL Server數(shù)據(jù)庫(kù)占用過多內(nèi)存時(shí)產(chǎn)生的一些問題
  5. SQL Server數(shù)據(jù)庫(kù)鎖的引入的緣由

 

責(zé)任編輯:佚名 來源: 比特網(wǎng)
相關(guān)推薦

2010-07-06 15:22:00

SQL Server

2010-07-20 17:47:12

2010-07-20 17:36:55

SQL Server

2010-07-22 14:46:41

SQL Server

2009-04-30 09:56:29

微軟SQL Server 緩存依賴

2010-07-08 15:26:05

SQL Server

2010-07-16 14:17:18

SQL Server

2010-07-20 10:02:41

SQL Server

2011-03-28 15:28:03

SQL Server 數(shù)據(jù)庫(kù)

2011-08-11 09:12:31

SQL Server nolock

2010-07-12 12:41:16

SQL Server

2011-08-22 09:55:30

SQL Server 排序

2011-09-07 15:11:31

SQL Server同步

2011-08-04 15:20:52

SQL Server數(shù)據(jù)庫(kù)鏡像

2011-08-15 15:40:57

SQL Server 系統(tǒng)數(shù)據(jù)庫(kù)

2010-07-02 10:47:20

SQL Server

2011-03-28 14:16:31

SQL Server 數(shù)據(jù)庫(kù)

2011-04-06 17:30:41

SQL ServerSQL

2010-07-07 15:21:21

SQL Server

2011-08-22 14:00:13

SQL Server 游標(biāo)調(diào)用函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)