|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQLAB公司的一个高级开发者者表示,“这个特点使得MySQL可以根据你当前的系统的需要来进行调整。” 实行情况是SQLServer中设定用户权限的认证体例,比方,当您登录到SQLServer的时分,登录账户就被付与了必定的权限,个中大概包含登录的功效、会见数据库和在数据库中实行某些操纵的功效。
SQLServer2005包括了EXECUTEAS语句,经由过程利用EXECUTEAS语句,您能够为批处置和历程转换实行情况,如许,挪用该批处置或历程的用户就能够利用分歧的权限来操纵了。
一切权链
在我正式解说SQLServer2005中实行情况的成绩之前,先来复杂地说说一切权链的事情道理。
当用户实行一个存储历程的时分(假定该用户具有实行该存储历程的权限),SQLServer将该存储历程的一切者与这个存储历程所触及到的工具的一切者举行对照,假如他们的一切者不异,那末就不用对这些援用工具的权限举行评价了。
以是,假如用户Tim取得了存储历程usp_ProcedureChain的权限,而usp_ProcedureChain存储历程的一切者是dbo,那末,假如dbo还同时具有usp_ProcedureChain所挪用的其他存储历程,那末Tim在实行这个存储历程的时分就不会呈现毛病。
实行情况的转换
在SQLServer2000中,您可使用SETUSER命令来摹拟SQL用户的实行情况,但成绩在于,只要体系办理员大概数据库的一切者才干利用这个命令,并且Windows账户也不克不及利用该命令。
在SQLServer2005中,EXECUTEAS语句能够替换SETUSER来改动存储历程、触发器、批处置大概函数的实行情况。假如实行情况酿成了别的一个用户,那末SQLServer将反省该用户的权限。假如您必要在创立或修正一个存储历程或函数的时分指定EXECUTEAS语句,您必要具有IMPERSONATE的权限,和创立该工具的权限。
实例
正如我方才所先容的一样,改动存储历程的实行情况十分有效,接上去我将经由过程实例来说解怎样完成这一功效。在这个例子中,您会看到怎样利用EXECUTEAS将没有切实权限的利用者摹拟为一切者对表格举行拔出操纵。
在第一行语句中,我利用了REVERT命令,如许,您就能够完全地前往到例子中,而不用忧虑必要扫除任何工具。
REVERT
GO 鄙人面的代码的第七行,我利用了扫除语句,如许能够反省我在随后的例子中要利用的工具是不是已存在,假如已存在,就将其扫除。
IFOBJECT_ID(usp_InsertMyTable,P)>0
DROPPROCEDUREusp_InsertMyTable
GO
IFOBJECT_ID(TableOwnerSchema.MyTable,U)>0
DROPTABLETableOwnerSchema.MyTable
GO
IFEXISTS
(SELECT*FROMsys.schemasWHEREname=NTableOwnerSchema)
DROPSCHEMA[TableOwnerSchema]
IFEXISTS
(SELECT*FROMsys.database_principalsWHEREname=NBaseUser)
DROPUSERBaseUser
IFEXISTS
(SELECT*FROMsys.server_principalsWHEREname=NBaseUser)
DROPLOGINBaseUser
IFEXISTS
(SELECT*FROMsys.database_principalsWHEREname=NTableOwner)
DROPUSERTableOwner
IFEXISTS
(SELECT*FROMsys.server_principalsWHEREname=NTableOwner)
DROPLOGINTableOwner 以下的剧本语句创立了两个登录名和数据库的用户账户,注重,CHECK_EXPIRATION和CHECK_POLICY语句,这两条语句是SQLServer2005中新呈现的。这些语句告知SQLServer不要对这个用户账户强迫实行暗码停止刻日战略,同时也不要举行任何范例的暗码战略反省,关于强迫平安战略而言,这些长短常无效的办法。
CREATELOGIN[BaseUser]WITHPASSWORD=Nbaseuser,
DEFAULT_DATABASE=[TRS],
CHECK_EXPIRATION=OFF,CHECK_POLICY=OFF
GO
CREATEUSER[BaseUser]FORLOGIN[BaseUser]
GO
CREATELOGIN[TableOwner]WITHPASSWORD=Ntableowner,
DEFAULT_DATABASE=[TRS],
CHECK_EXPIRATION=OFF,CHECK_POLICY=OFF
GO
CREATEUSERTableOwnerFORLOGINTableOwner
GO 在SQLServer2005中,形式不再是和数据库用户不异的事变了,关于所包括的工具而言,它处于完整分歧的称号空间。用户和形式的分别是SQLServer2005中的一猛进步,如许做使工具的一切权能够分别,并且比SQLServer2000更容易于办理,以下的语句创立了我们将要利用的数据库形式:
CREATESCHEMA[TableOwnerSchema]AUTHORIZATION[TableOwner]
GO
NowIenableloginssotheycanbeused:
ALTERLOGIN[TableOwner]ENABLE
ALTERLOGIN[BaseUser]ENABLE
GO
GRANTCREATETABLETOTableOwner
GO 起首,我利用了EXECUTEAS命令,我将以后的实行情况设定为TableOwner,在运转了这个命令以后,一切的权限评价将以TableOwner运转,而之前的体系办理员权限将不再合用。
EXECUTEASUSER=TableOwner
GO 运转这个语句就可以够标明如今的实行情况是TableOwner:
SELECTSESSION_USER
GO 这个剧本将在TableOwnerSchema的形式中创立一个名为MyTable的表格,由于我已付与了该用户CREATETABLE的权限,以是TableOwner能够实行这条语句。
CREATETABLETableOwnerSchema.MyTable
(
Field1INT
)
GO 当我运转REVERT语句的时分,能够在实行情况链中回退一步,在SQLServer2005中,实行情况是能够嵌套的,以是假如您在统一个数据库毗连中有良多用户在运转,您大概必要屡次实行该语句以前往到原始的登录情况。
REVERT
GO
SELECTSESSION_USER
GO 如今我要对新的表格举行疾速选择以确认它的存在:
SELECT*FROMTableOwnerSchema.MyTable
GO 以下的剧本创立了一个历程能够拔出新的TableOwnerSchema.MyTable表格,注重我在历程界说中利用了WITHEXECUTEASTableOwner语句,这意味着该历程被实行的时分,它将在TableOwner的实行情况中被实行。
CREATEPROCEDUREusp_InsertMyTable
WITHEXECUTEASTableOwner
AS
BEGIN
INSERTINTOTableOwnerSchema.MyTable(Field1)VALUES(8)
END
GO 我还能够将实行权限付与一个用户账户,在这类情形下,我利用之前创立的名为BaseUser的用户。
GRANTEXECONusp_InsertMyTableTOBaseUser
GO 接上去,我将实行情况转换为BaseUser并实验运转存储历程:
EXECUTEASUSER=BaseUser
GO
EXECusp_InsertMyTable
GO 如今我能够向TableSchema.MyTable表格中增加纪录了,由于在这个过程当中TableOwner同意我如许做,而BaseOwner并没有明白的权限能够向该表格增加纪录,以是该用户的任未尝试城市招致毛病的产生。为了演示这个成绩,能够运转以下的剧本,该剧本改动了我们方才的历程,改成运转在挪用者的实行情况中。
REVERT
GO
ALTERPROCEDUREusp_InsertMyTable
AS
BEGIN
INSERTINTOTableOwnerSchema.MyTable(Field1)VALUES(8)
END
GO
EXECUTEASUSER=BaseUser
GO
EXECusp_InsertMyTable
GO
REVERT 开辟者和数据库办理员会发明在实行存储历程的时分转换权限十分有效,特别是您处置TRUNCATETABLE语句的时分,这个办法能帮上年夜忙,由于TRUNCATETABLE并没有能够指定的权限。您能够将权限付与将要举行截取表格操纵的用户,然后在操纵停止的时分再将原本的权限设定恢复就能够了。
有的时候,一些缺失的功能可以通过别的办法来实现,例如,在MySQL4.1以前,你可以通过使用join方法来替代子查询的功能。在MySQL5.0中,大多数关系型数据库所要求的功能已经都具备。 |
|