亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

修改SQL Server 2005執行環境

添加時間:2013-4-19 16:56:33  添加: 思海網絡 
 執行環境是SQL Server中設定用戶權限的認證方式,例如,當您登錄到SQL Server的時候,登錄賬戶就被賦予了一定的權限,其中可能包括登錄的功能、訪問數據庫以及在數據庫中執行某些操作的功能。

  SQL Server 2005包含了EXECUTE AS語句,通過使用EXECUTE AS語句,您可以為批處理和過程轉換執行環境,這樣,調用該批處理或過程的用戶就可以使用不同的權限來操作了。

  所有權鏈

  在我正式講解SQL Server 2005中執行環境的問題之前,先來簡單地說說所有權鏈的工作原理。

  當用戶執行一個存儲過程的時候(假定該用戶擁有執行該存儲過程的權限),SQL Server將該存儲過程的所有者與這個存儲過程所涉及到的對象的所有者進行對比,如果他們的所有者相同,那么就不必對這些引用對象的權限進行評估了。

  所以,如果用戶Tim獲得了存儲過程usp_ProcedureChain的權限,而usp_ProcedureChain存儲過程的所有者是dbo,那么,如果dbo還同時擁有usp_ProcedureChain所調用的其他存儲過程,那么Tim在執行這個存儲過程的時候就不會出現錯誤。

  執行環境的轉換

  在SQL Server 2000中,您可以使用SETUSER命令來模擬SQL用戶的執行環境,但問題在于,只有系統管理員或者數據庫的所有者才能使用這個命令,而且Windows賬戶也不能使用該命令。

  在SQL Server 2005中,EXECUTE AS語句可以替代SETUSER來改變存儲過程、觸發器、批處理或者函數的執行環境。如果執行環境變成了另外一個用戶,那么SQL Server將檢查該用戶的權限。如果您需要在創建或修改一個存儲過程或函數的時候指定EXECUTE AS語句,您需要具備IMPERSONATE的權限,以及創建該對象的權限。

  實例

  正如我剛才所介紹的一樣,改變存儲過程的執行環境非常有用,接下來我將通過實例來講解如何實現這一功能。在這個例子中,您會看到如何使用EXECUTE AS將沒有確切權限的使用者模擬為所有者對表格進行插入操作。

  在第一行語句中,我使用了REVERT命令,這樣,您就可以完整地返回到例子中,而不必擔心需要清除任何對象。

REVERT
GO

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

IF OBJECT_ID('usp_InsertMyTable','P')>0
DROP PROCEDURE usp_InsertMyTable
GO
IF OBJECT_ID('TableOwnerSchema.MyTable','U')>0
DROP TABLE TableOwnerSchema.MyTable
GO
IF EXISTS
(SELECT * FROM sys.schemas WHERE name = N'TableOwnerSchema')
DROP SCHEMA [TableOwnerSchema]
IF EXISTS
(SELECT * FROM sys.database_principals WHERE name = N'BaseUser')
DROP USER BaseUser
IF EXISTS
(SELECT * FROM sys.server_principals WHERE name = N'BaseUser')
DROP LOGIN BaseUser
IF EXISTS
(SELECT * FROM sys.database_principals WHERE name = N'TableOwner')
DROP USER TableOwner
IF EXISTS
(SELECT * FROM sys.server_principals WHERE name = N'TableOwner')
DROP LOGIN TableOwner

  以下的腳本語句創建了兩個登錄名和數據庫的用戶賬戶,注意,CHECK_EXPIRATION和CHECK_POLICY語句,這兩條語句是SQL Server 2005中新出現的。這些語句告訴SQL Server不要對這個用戶賬戶強制執行密碼截止期限策略,同時也不要進行任何類型的密碼策略檢查,對于強制安全策略而言,這些是非常有效的方法。

CREATE LOGIN [BaseUser] WITH PASSWORD=N'baseuser',
DEFAULT_DATABASE=[TRS],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
CREATE USER [BaseUser] FOR LOGIN [BaseUser]
GO
CREATE LOGIN [TableOwner] WITH PASSWORD=N'tableowner',
DEFAULT_DATABASE=[TRS],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
CREATE USER TableOwner FOR LOGIN TableOwner
GO

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

CREATE SCHEMA [TableOwnerSchema] AUTHORIZATION [TableOwner]
GO
Now I enable logins so they can be used:
ALTER LOGIN [TableOwner] ENABLE
ALTER LOGIN [BaseUser] ENABLE
GO
GRANT CREATE TABLE TO TableOwner
GO

  首先,我使用了EXECUTE AS命令,我將當前的執行環境設定為TableOwner,在運行了這個命令之后,所有的權限評估將以TableOwner運行,而以前的系統管理員權限將不再適用。

EXECUTE AS USER = 'TableOwner'
GO

  運行這個語句就能夠表明現在的執行環境是TableOwner:

SELECT SESSION_USER
GO

  這個腳本將在TableOwnerSchema的模式中創建一個名為MyTable的表格,因為我已經賦予了該用戶CREATE TABLE 的權限,所以TableOwner可以執行這條語句。

CREATE TABLE TableOwnerSchema.MyTable
(
Field1 INT
)
GO

  當我運行REVERT語句的時候,可以在執行環境鏈中回退一步,在SQL Server 2005中,執行環境是可以嵌套的,所以如果您在同一個數據庫連接中有很多用戶在運行,您可能需要多次執行該語句以返回到原始的登錄環境。

REVERT
GO
SELECT SESSION_USER
GO

  現在我要對新的表格進行快速選擇以確認它的存在:

SELECT * FROM TableOwnerSchema.MyTable
GO

  以下的腳本創建了一個過程可以插入新的TableOwnerSchema.MyTable表格,注意我在過程定義中使用了WITH EXECUTE AS 'TableOwner'語句,這意味著該過程被執行的時候,它將在TableOwner的執行環境中被執行。

CREATE PROCEDURE usp_InsertMyTable
WITH EXECUTE AS 'TableOwner'
AS
BEGIN
INSERT INTO TableOwnerSchema.MyTable(Field1)VALUES(8)
END
GO

  我還可以將執行權限賦予一個用戶賬戶,在這種情況下,我使用以前創建的名為BaseUser的用戶。

GRANT EXEC ON usp_InsertMyTable TO BaseUser
GO

  接下來,我將執行環境轉換為BaseUser并嘗試運行存儲過程:

EXECUTE AS USER = 'BaseUser'
GO
EXEC usp_InsertMyTable
GO

  現在我可以向TableSchema.MyTable表格中添加記錄了,因為在這個過程中TableOwner允許我這樣做,而BaseOwner并沒有明確的權限可以向該表格添加記錄,所以該用戶的任何嘗試都會導致錯誤的發生。為了演示這個問題,可以運行以下的腳本,該腳本改變了我們剛才的過程,改為運行在調用者的執行環境中。

REVERT
GO
ALTER PROCEDURE usp_InsertMyTable
AS
BEGIN
INSERT INTO TableOwnerSchema.MyTable(Field1)VALUES(8)
END
GO
EXECUTE AS USER = 'BaseUser'
GO
EXEC usp_InsertMyTable
GO
REVERT

  開發者和數據庫管理員會發現在執行存儲過程的時候轉換權限非常有用,尤其是您處理TRUNCATE TABLE語句的時候,這個方法能幫上大忙,因為TRUNCATE TABLE并沒有可以指定的權限。您可以將權限賦予將要進行截取表格操作的用戶,然后在操作結束的時候再將原有的權限設定恢復就可以了。

關鍵字:數據庫、SQL Server

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站