国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > SQL Server > 正文

修改SQL Server 2005執(zhí)行環(huán)境

2024-08-31 00:50:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  執(zhí)行環(huán)境是sql server中設(shè)定用戶(hù)權(quán)限的認(rèn)證方式,例如,當(dāng)您登錄到sql server的時(shí)候,登錄賬戶(hù)就被賦予了一定的權(quán)限,其中可能包括登錄的功能、訪問(wèn)數(shù)據(jù)庫(kù)以及在數(shù)據(jù)庫(kù)中執(zhí)行某些操作的功能。

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

  所有權(quán)鏈

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

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

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

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

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

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

  實(shí)例

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

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

revert
go

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

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

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

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

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命令,我將當(dāng)前的執(zhí)行環(huán)境設(shè)定為tableowner,在運(yùn)行了這個(gè)命令之后,所有的權(quán)限評(píng)估將以tableowner運(yùn)行,而以前的系統(tǒng)管理員權(quán)限將不再適用。

execute as user = 'tableowner'
go

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

select session_user
go

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

create table tableownerschema.mytable
(
field1 int
)
go

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

revert
go
select session_user
go

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

select * from tableownerschema.mytable
go

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

create procedure usp_insertmytable
with execute as 'tableowner'
as
begin
insert into tableownerschema.mytable(field1)values(8)
end
go

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

grant exec on usp_insertmytable to baseuser
go

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

execute as user = 'baseuser'
go
exec usp_insertmytable
go

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

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 米泉市| 南岸区| 河东区| 宽甸| 樟树市| 仙桃市| 女性| 沈丘县| 密云县| 永安市| 喀喇| 安达市| 桐柏县| 共和县| 屯门区| 泰顺县| 栾川县| 荆门市| 京山县| 额尔古纳市| 桃园县| 金昌市| 子洲县| 孟津县| 镇巴县| 堆龙德庆县| 普兰店市| 彰化县| 建平县| 北海市| 托克逊县| 临沭县| 新龙县| 塔城市| 墨脱县| 陆丰市| 馆陶县| 兰考县| 长顺县| 同江市| 乐昌市|