在直接使用SQL语句还是存储过程来处理业务逻辑时,永远不要给用户直接访问表的权限

可以只给他们访问视图和存储过程的权限,永远不要给用户直接访问表的权限,首先会执行预编译,至少在防非法注入(inject)方面提供更好的保护,在一个独立数据库里的数据和对象访问安全,Server里的安全功能充分利用,选择”db,于是需要设置登录名Test的相关权限

图片 6

恒久不要给客商一贯访问表的权能。倘若你希望让客户使用人机联作式工具如Microsoft Acess 
二零零零来访谈数据库,能够只给他俩做客视图和存储进程的权位,实际不是对表的直白访问权
限。倘若存款和储蓄进度的具有者是“dbo”,何况蕴藏进程所引述的表和视图的具有者也都以
“dbo”,授予客商对存款和储蓄进度的实践(EXECUTE)权限就足足了。这样就一贯并非检核查表
的会见权限了。 

<生龙活虎>存款和储蓄进度加密

在保密你的服务器和数量,防范当前复杂的口诛笔伐,SQL
Server有您必要的总体。但在您能管用行使那一个安全功用前,你要求驾驭您直面的威胁清劲风华正茂部分中心的安全概念。那篇作品提供了幼功,由此你能够对SQL
Server里的平安功能丰硕利用,不用在面前蒙受特定威迫,无法维护你多少的效果上浪费时间。

在专门的学问个中遇到一个近乎那样的主题材料:要对数据库账户的权力举办清理、设置,此中有三个顾客Test,只能具有数据库MyAssistant的DML(更新、插入、删除等State of Qatar操作权限,别的全部实行数据仓库储存款和储蓄进度、函数的权限,可是无法展开DDL操作,于是供给设置签到名Test的有关权限:

您还足以行使别的安全特点,比方通过在存款和储蓄进程中步向商业逻辑来决定什么字段或行能够
被访谈。视图是挡住客户直接访谈表的另风流罗曼蒂克种门路。与储存进程的不相同是,你可感觉视图授
予SELECT、INSERT、UPDATE或DELETE权限,而存款和储蓄进度则只好给与EXECUTE权限。 

骨子里,用了那十多年的SQL
server,小编已经成了蕴藏进度的赤诚拥趸。在向来使用SQL语句如故存款和储蓄进度来拍卖业务逻辑时,作者基本会毫不犹豫地采纳前者。


1:右键单击登入名Test的属性.

还会有风流倜傥件须求留意的政工是,假使您在其余一个数据库中进行SELECT语句,数据库对象具有
者的的链式关系依然适用。比方说,在由SQL Server登入名“sa”所全部的pubs数据库中,
您就不可能奉行跨表查询连接至被八个NT登入名所持有的数据库中,就算七个登陆名都以
“sysadmin”角色的分子。若是您期待连接来自3个不等数据库的表,那么那3个数据库的拥
有者应该是同叁个帐号。假设须要的话你能够动用存款和储蓄进度“sp_changedbowner”来改换数
据库的具备者。 

理由如下:

从令人头昏眼花的客商端应用连接,通过外地布满的网络,特别是互连网,关全面据库在种种应用程序里大规模利用。那使数码对任什么人,在别的地点都可访问。数据库能够保留人类文化的很超越八分之四,包涵中度灵活的个人消息和让国际商务工作的重大数据。

2: 在服务器剧中人物里面选拔”public”服务器角色。

1、使用存款和储蓄进度,最少在防不合规注入(inject卡塔尔方面提供更加好的爱戴。起码,存款和储蓄进度在进行前,首先会推行预编写翻译,(借使出于地下参数的案由)编写翻译出错则不会实践,这在某种程度上提供风流倜傥层天然的烟幕弹。

对此想要偷取数据或透过窜改数据来加害数据的具备者的
人来讲,那个效用使数据库成为有吸重力的目的。确认保证您的数额安全部是SQL
Server配置和行使它来保存数据的主次的第生机勃勃部分。那一个类别会搜索SQL Server
二零一二平安的中坚,那样的话你能够保证你的数量和服务器财富,按你供给的安全品级来保卫安全数量,免受那一个勒迫对你多少的熏陶。超越50%音信对SQL
Server的最早版本也适用,回到SQL Server
二〇〇七也可以,因为那是微软在成品里到底反省安全的时候。但本人也构和谈只在SQL
Server 2013和三翻五次版本里才有的效果与利益。

3:在顾客映射选项当中,接受”db_datareader”、”db_datawriter”、”public”多少个数据库角色成员。

本人于今还记得大致八、三年前使用的叁个权力决定种类正是经过拼凑贰个SQL语句,最后获得了五个形如“
where 1=1 and dataID in (1,2卡塔尔(قطر‎ and ModelID in (2,455State of Qatar And ShopID in (111卡塔尔国and departID in ( 1,3卡塔尔 and ([Name] like %myword%)”的where条件子句来获取切合条件的结果集。

大部岁月,你只要关心唯有叁个持有者的,在三个单独数据Curry的多寡和对象访谈安全。但一时你需求接触到外围的数据库从多少个数据库范文数据和对象,它引起部分康宁难点,扩展了数量访谈的目迷五色。在这里篇小说里,你会学习跨数据库全部权链接,那样的话,你能够接触到跨数据库边界的安全。

此刻,已经完成了装有DML操作权限,如若急需有所存款和储蓄进程和函数的实施权限,必需接纳GRANT语句去授权,一个临盆库的囤积进度和函数加起来成千上百,假诺手工业推行的话,那将是叁个烦劳的体力活,而本身手下有十几个库,所以必需用脚本去得以完结授权进程。上边是本身写的一个存款和储蓄进程,亮点主要在于会判别期存款款和储蓄进程、函数是不是曾经授予了EXE或SELECT权限给有个别客户。这里关键选拔了来宾目录试图sys.database_permissions,例如,数据Curry面有个存款和储蓄进度dbo.sp_authorize_right,假若这一个蕴藏进程授权给Test顾客了话,那么在目录试图sys.database_permissions里面会有一条记下,如下所示:

瞩目:那一个参数是经过地点栏web应用的地址栏或Winform的UI分界面来输入的,所以对恶意注入必要花费一定的本钱来敬服。因为部分常用的根本字(或敏感词)很难区分是恶意或非恶意。

全数权链接

大比很多岁月,你都很或然创制援用别的对象的数据库,全体目的都包罗在同个数据Curry。例子满含,在同个数据库里访谈表的蕴藏进程,在同个数据Curry把表链接黄金时代道的视图等等。可是有的时候,你会需求创建越过数据库边界的拜望别的对象的目的。对于绝大好些个,对于跨数据库范文的乌兰察布准则都以一模二样的,只要在同个数据Curry。访问的顾客供给在它们平素访谈的目的上有须求的准予,三回九转的全体权链接允许SQL
Server收缩许可检查等等。毕竟,SQL
Server无法放松警惕,不管对象放在何地!在三个数据Curry,全数权链接简化安全管理,雷同也适用于跨数据库。

你是或不是在三个数据Curry依旧跨过数据库边界,全部权链接咋办事的中坚都以同后生可畏的。全部的数据库对象有个具有者,全数者调节在它兼具的对象上什么人有承认。访谈其余对象的指标——举例在SELECT语句里老是多少个表的囤积进度——构成八个全部权链接,它是连接的,只要单个全数者具备有着关乎的目的。

在最高层对象上具备许可的顾客的结果——多个储存进度或视图,举个例子——访问其余对象的客商没有要求在秘密目的上有许可,只要那是一个连连的全数权链接。SQL
Server在这里么的目的上,风华正茂旦注解在最高层对象具备许可,就终止检查许可。这一个布局给全部者在神秘目的的拜望,越来越多更加好的主宰,因为客户只要求在它们平昔访问的靶子上有许可。

提示:

明亮全部权链接只适用于对象许可非常关键,譬喻SELECT,UPDATE和EXECUTE的操作。SQL
Server总在数额定义语句上检查许可,因为那几个许可只适用于语句实际不是指标。

若果本人将该存款和储蓄进程付与EXEC权限给TEST1,那么

2、使用存款和储蓄进程并不是间接访谈基表,能够提供更加好的安全性。你能够在行级或列级调整数据如何被改进。绝对于表的探望,你能够确定有施行权限许可的客户推行相应的蕴藏进度。那也是拜访数据服务器的惟风流洒脱调用场径。由此,任何偷窥者将不能够看出你的SELECT语句。换句话说,每一种应用只可以具备相应的储存进程来做客基表,并不是“SLEECT
*”。

跨数据库全部权链接

跨数据库全体权链接是全体权链接的延长,全数的指标——富含顾客向来访谈的靶子和秘密援用的靶子——都在二个数据Curry。跨数据库全体权链接的有一无二差距是跨数据库边界。因而你可以在二个数据Curry有个在三个数据Curry把数据连接一齐的视图。或在三个数据Curry会见对象的储存进度。在这里些景况下,客商一贯访谈的源对象决议于在另三个数据Curry包涵的对象。

全部权链接的两连串型直接的必须要经过的路首要分裂是拜会数据库,对象全体者的着入眼。数据库客商是在单个数据Curry全然满含的基本点。即便四个数据库各样有同样的称呼,它们是独自的,分裂的重头戏,因而不能够在连年的全体权链接里插手,除非全体那几个客商映射到同个数据库级其他记名。因而它是有关全体者的登入,不是数据库客户。那正是人命关天概念:在三回九转全数权链接里对象的公物全数者是服务器品级的重点,实际不是数据库级其他基点。

在里面,SQL
Server通过它们的安全ID(SID)实际不是客户名来标记对象全数者。在单个数据Curry,单个顾客全数的兼具目标有二个SID
,作为全数者,因为在数据Curry只有贰个顾客有卓殊名称。但跨数据,SID是在服务器等第上的极限登陆。在区别的数据Curry分化的客户可以提到不相同登陆,由此会有两样的SID。那是顾客和登陆相比较,很恐怕是八个最轻易混淆的方面,因而这一点你要明确清楚。

接连的跨数据库全部权链接供给对象全部者的一切——源对象和具有援引的对象——用平等的SID映射到同个登入。

GRANT EXEC ON dbo.sp_diskcapacity_cal TO Test;

3、存款和储蓄进程能够加密。(那点非常实用,伪造一下,您的数据库服务器是托管的或租用的,你是还是不是能光明正大的每天睡个安稳觉。要是角逐敌手“一不小心”登上您的SQL
Server,或透过注入得到了你的贮存进度,然后相应的流入恶意的SQL,将您的业务逻辑乱改一通,而恰恰您五分钟前又没做备份,那会怎么?)

搜寻跨数据库全体权链接

那篇文章的代码演示了如何选取跨数据库全体权链接,并寻觅它的特点。代码通过在服务器品级成立名称叫SharedLogin的记名初始,如代码7.1所示。接下来代码应用这么些作为用来在全数权链接里对象的分享全数者。

1 USE master;
2 GO
3 
4 IF SUSER_SID('SharedLogin') IS NOT NULL DROP LOGIN SharedLogin;
5 CREATE LOGIN SharedLogin WITH password = 'Y&2!@37z#F!l1zB';
6 GO

代码7.1:创制会是指标全数者的SharedLogin登入的代码

在跨数据库全部权链接里大家要涉及到多个数据库,因而接下去的代码会创设它们。满含客商一向访问对象的数据库名称为SourceDB,引用对象的数据库会是ChainedDBChainedDB满含叁个dbo.AlaskaCity表,包括阿Russ加四个最大城市的人口的部分多少。代码7.2创制ChainedDB和它的AlaskaCity表,在表里插入一些数码,用二〇〇八的人头考察数据。

 1 IF DB_ID('ChainedDB') IS NOT NULL DROP DATABASE ChainedDB;
 2 CREATE DATABASE ChainedDB;
 3 GO
 4 USE ChainedDB;
 5 GO
 6 
 7 -- Create a table for access from another database
 8 CREATE TABLE dbo.AlaskaCity
 9 (
10     AlaskaCityID INT NOT NULL IDENTITY(1, 1), 
11     CityName NVARCHAR(20) NOT NULL, 
12     Population INT NOT NULL
13     CONSTRAINT PK_AlaskaCity PRIMARY KEY (AlaskaCityID)
14 );
15 GO
16 
17 INSERT INTO dbo.AlaskaCity (CityName, Population)
18     VALUES ('Fairbanks', 31535), ('Anchorage', 291826), ('Juneau', 31275);
19 GO

代码7.2:创设ChainedDB数据库和有插入样品数量的AlaskaCity表的代码

接下去的代码创立SourceDB数据库,满含一个客户在ChainedDB数据Curry,从AlaskaCity一直访谈,获取数据的视图。如代码7.3所示,包括四个SELECT语句来测量试验一切不奇怪。假使您以sysadmin登入的话,这一切都会平常,因为在SQL
Server实例里你有全数对象的意气风发体化访问,有用全部创制的靶子,前段时间是dbo,你应该能够看见阿Russ加的总人口多少。以sysadmin运营是很便利,但对生育应用并不安全,常常客商访谈代码不会有全部对象的分子身价。

 1 IF DB_ID('SourceDB') IS NOT NULL DROP DATABASE SourceDB;
 2 CREATE DATABASE SourceDB;
 3 GO
 4 USE SourceDB;
 5 GO
 6 
 7 -- Create a view that accesses ChainedDB.dbo.AlaskaCity
 8 CREATE VIEW dbo.AlaskaCitiesView AS
 9     SELECT * FROM ChainedDB.dbo.AlaskaCity;
10 GO
11 
12 SELECT * FROM dbo.AlaskaCitiesView ORDER BY Population DESC;

代码7.3:成立SourceDB数据库和在ChainedDB数据库里访谈AlaskaCity表的视图的代码

现在我们有2个数据库,三个是在另贰个数据Curry,有援引另多个对象,以sysadmin运行一切符合规律。因而现在我们创立八个更实在的事例来打破代码。代码7.4在SourceDB数据Curry创造叁个炫彩到SharedLoginSourceUser,并在AlaskaCitiesView视图上给以SELECT许可给客户。然后代码改革试行上下文到SharedLogin,尝试访谈视图。SELECT语句会成功么?

 1 USE SourceDB;
 2 GO
 3 
 4 -- Create a user in the SourceDB who will access the view
 5 CREATE USER SourceUser FOR LOGIN SharedLogin;
 6 GRANT SELECT ON dbo.AlaskaCitiesView TO SourceUser;
 7 GO
 8 
 9 -- Try accessing the view as SourceUser
10 EXECUTE AS LOGIN = 'SharedLogin';
11 SELECT * FROM dbo.AlaskaCitiesView ORDER BY Population DESC;
12 GO
13 REVERT;

代码7.4:创设SourceUser数据库顾客,映射到SharedLogin,并用代码测量试验访谈视图

图片 1

未曾水到渠成,SELECT语句抛出了三个老大。

我们有时先退一步。大家有完全的跨数据库全部权链接:视图和表享有同盟成员身价,它是自个儿的登陆(sysadmin),同一时间在数据Curry映射到dbo。到此处都一切平常。但跨数据库成员身价全体权链接未有在数据库实例里启用,对2个新的数据库也尚未启用。接下来咱们来启用它。

GRANT EXEC ON dbo.sp_diskcapacity_cal TO Test1;

(注意:加密囤积进程前应该备份原始存储进程,且加密应该在布局到生育意况前产生。)

启用跨数据库全数权链接

在SQL
Server实例的全新安装里,使用跨数据库成员身份全体权链接的选项暗中同意是密封的。那是因为启用那一个选项,实例的安全护甲里展开了多少个小孔;在这里篇小说里稍后会解释。当那几个选项禁止使用时,现代码依赖于成员身份链接是,会转换许可谢绝的不当。(一会你就能够看出,在让代码正常办事先,这不是你要修正的独一难点,可是大家率先个要处理的)。

您能够在服务器等第或数据库等第启用跨数据库成员身份链接,在服务器品级使用T-SQL语句或SSMS。

SELECT * FROM sys.sysusersWHERE name =’Test’ OR name =’Test1′

积累进程的加密非常轻易,大家看二个事例:

在服务器品级启用

对具备的数据库,在服务器等级启用跨数据库全数权链接选项。若是你启用它,它是指向性富有数据库的,你不可能在数据库品级约束它。

接纳SSMS,在指标浏览器右击服务器实例,从弹出的美食指南选择【属性】。选择【安全性】页,在对话框的底层,你会看出【跨数据库全数权链接】选项,如插图7.1所示。点击【鲜明】,在实例里的具备数据库会启用它。

图片 2

插图7.1:使用服务器质量对话框启用跨数据库全体权链接

你也足以动用T-SQL代码做同样的改换,如代码7.5所示。和其余服务器实例选项,设置cross db ownership
chaining选项为1来启用它,设回0禁绝它。记得使用RECONFIGURE语句,那样的话你不须求重启实例让纠正生效。豆蔻梢头旦您实行了这么些代码,你能够在此个数据库实例里的其他数据Curry,使用跨数据库全数权链接。

1 USE master;
2 GO
3 
4 EXECUTE sp_configure 'cross db ownership chaining', 1;
5 RECONFIGURE;

代码7.5:使用sp_configure系统存款和储蓄进程启用跨数据库全部权链接

不论你用SSMS依旧T-SQL代码来启用跨数据库所有权链接,现在把它破产。那不是启用它的特级方法,除非您想在实例里的每一个数据库里从源对象里引用对象。不是的话,在实例等第启用它太不安全,那样做不明智。

只在必要的数据库启用跨数据库全部权链接才是明智的。

其实grantee_principal_id代表向其给与权限的数据库器重 ID
,所以本身就会透过上面四个视图来判别期存款款和储蓄进程是还是不是授予实行权限给客商Test与否,同理,对于函数也是这么,存储进度如下所示,其实那个蕴藏进程还是能扩充,假如你有非常的供给的话。复制代码 代码如下:Code SnippetUSE
MyAssistant;GOSET ANSI_NULLS ON;GOSET QUOTED_IDENTIFIER ONGOIF
EXISTS(SELECT 1 FROM sysobjects WHERE
id=OBJECT_ID(N’sp_authorize_right’) AND OBJECTPROPERTY(id,
‘IsProcedure’) =1) DROP PROCEDURE
sp_authorize_right;GO–=========================================================================================================–
ProcedureName : sp_authorize_right– Author : Kerry — CreateDate :
二〇一一-05-10 — Blog : — Description :
将数据库的全数自定义存款和储蓄进程或自定义函数赋权给有个别客户(能够继承扩大State of Qatar/**********************************************************************************************************
Parameter :
参数表达***********************************************************************************************************
@type : ‘P’ 代表存储进度 , ‘F’ 代表存款和储蓄进程,假使急需能够扩充别的对象
@user :
有些客商账户***********************************************************************************************************
Modified Date Modified User Version Modified
Reason***********************************************************************************************************
二〇一三-05-13 Kerry V01.00.01 肃清系统存款和储蓄进度和系统函数的授权处理二〇一一-05-14 Kerry V01.00.02 扩张决断,要是某些存款和储蓄进程已经赋予权力
则不做任何操作***********************************************************************************************************/–=========================================================================================================CREATE
PROCEDURE sp_authorize_right( @type AS CHAR(10) , @user AS
VARCHAR(20))AS DECLARE @sqlTextVARCHAR(1000); DECLARE @UserId INT;SELECT
@UserId = uid FROM sys.sysusers WHERE name=@user; IF @type = ‘P’ BEGIN
CREATE TABLE #ProcedureName( SqlText VARCHAR(max)); INSERT INTO
#ProcedureName SELECT ‘GRANT EXECUTE ON ‘ + p.name + ‘ TO ‘ + @user +
‘;’ FROM sys.procedures p WHERE NOT EXISTS( SELECT 1 FROM
sys.database_permissions r WHERE r.major_id = p.object_id AND
r.grantee_principal_id = @UserId AND r.permission_name IS NOT NULL )
SELECT * FROM #ProcedureName; –SELECT ‘GRANT EXECUTE ON ‘ + NAME + ‘
TO ‘ +@user +’;’ –FROM sys.procedures; –SELECT ‘GRANT EXECUTE ON ‘ +
[name] + ‘ TO ‘ +@user +’;’ — FROM sys.all_objects –WHERE
[type]=’P’ OR [type]=’X’ OR [type]=’PC’ DECLARE cr_procedure
CURSOR FOR SELECT * FROM #ProcedureName; OPEN cr_procedure; FETCH
NEXT FROM cr_procedure INTO @sqlText; WHILE @@FETCH_STATUS = 0 BEGIN
EXECUTE(@sqlText); FETCH NEXT FROM cr_procedure INTO @sqlText; END
CLOSE cr_procedure; DEALLOCATE cr_procedure; END ELSE IF @type=’F’
BEGIN CREATE TABLE #FunctionSet( functionName VARCHAR(1000)); INSERT
INTO #FunctionSet SELECT ‘GRANT EXEC ON ‘ + name + ‘ TO ‘ + @user + ‘;’
FROM sys.all_objects s WHERE NOT EXISTS( SELECT 1 FROM
sys.database_permissions p WHERE p.major_id = s.object_id AND
p.grantee_principal_id = @UserId) AND schema_id = SCHEMA_ID(‘dbo’)
AND( s.[type] = ‘FN’ OR s.[type] = ‘AF’ OR s.[type] = ‘FS’ OR
s.[type] = ‘FT’ ) ; SELECT * FROM #FunctionSet; –SELECT ‘GRANT EXEC
ON ‘ + name + ‘ TO ‘ + @user +’;’ FROM sys.all_objects — WHERE
schema_id =schema_id(‘dbo’) — AND ([type]=’FN’ OR [type] =’AF’ OR
[type]=’FS’ OR [type]=’FT’ ); INSERT INTO #FunctionSet SELECT
‘GRANT SELECT ON ‘ + name + ‘ TO ‘ + @user + ‘;’ FROM sys.all_objects s
WHERE NOT EXISTS( SELECT 1 FROM sys.database_permissions p WHERE
p.major_id = s.object_id AND p.grantee_principal_id = @UserId) AND
schema_id = SCHEMA_ID(‘dbo’) AND( s.[type] = ‘TF’ OR s.[type] =
‘IF’ ) ; SELECT * FROM #FunctionSet; –SELECT ‘GRANT SELECT ON ‘ +
name + ‘ TO ‘ + @user +’;’ FROM sys.all_objects — WHERE schema_id
=schema_id(‘dbo’) — AND ([type]=’TF’ OR [type]=’IF’) ; DECLARE
cr_Function CURSOR FOR SELECT functionName FROM #FunctionSet; OPEN
cr_Function; FETCH NEXT FROM cr_Function INTO @sqlText; WHILE
@@FETCH_STATUS = 0 BEGIN PRINT(@sqlText); EXEC(@sqlText); FETCH NEXT
FROM cr_Function INTO @sqlText; END CLOSE cr_Function; DEALLOCATE
cr_Function; ENDGO

安顿测量检验表

在数据库等第启用

举个例子在服务器等级你禁止使用了跨数据库全体权链接,如若您想接收它的话,你必需在数据库等第启用它。假使对于贰个数据库禁止使用了,数据库一点也不能够加入跨数据库全体权链接,不管是源还是链接数据库。为了让链接能够工作,源和链接数据库的设置必需启用。

对此具备的数据库,当你成立或附加它们的时候,默许跨数据库全数权链接是禁止使用的。但对master,msdb,tempdb系统数据库是启用的,对于model数据库是禁用的。因为SQL
Server内部使用跨数据库全部权链接,对于那个系统数据库,你不能启用或停用它。

唤醒:倘令你分手,重新附加已经启用跨数据库全体权链接的数据库,在附加回数据库后,你要求重新启用它。对于在服务器品级启用的无效,因为它自动应用到具有的数据库。

心痛SSMS在数据库属性对象框里有跨数据库全部权链接启用选项,假如在插图7.2选项页所示,它是只读的。为了订正数据库的那些值,你要求采替代码7.6,对SourceDB
ChainedDB数据库同一时间启用。那几个代码应用ALTEEnclave DATABASE语句的SET
DB_CHAINING选项来展开链接的开和关。

图片 3

插图7.2:对于ChainedDB数据库,跨数据库全数权链接选项是只读的

1 ALTER DATABASE ChainedDB SET DB_CHAINING ON;
2 ALTER DATABASE SourceDB SET DB_CHAINING ON;
3 GO

代码7.6:在七个数据Curry,ALTETucsonDATABASE代码来启用跨数据库全体权链接。

在八个数据Curry同有时候启用了跨数据库全体权链接,你能够重新尝试用SharedLogin的长治上下文访谈视图;代码7.7重新展现那些代码。

1 USE SourceDB;
2 GO
3 
4 EXECUTE AS LOGIN = 'SharedLogin';
5 SELECT * FROM dbo.AlaskaCitiesView ORDER BY Population DESC;
6 GO
7 REVERT;

代码7.7:使用跨数据库全体权链接访谈嫩跨数据库边界的靶子

图片 4

但代码依然回到雷同的错误。这一次的标题是还也有另四个供给:访谈视图对象的客户必必要走访链接数据库。客户在神秘的对象上没有必要有批准。事实上,顾客在丰富数据Curry无需任何许可。

代码7.8展现了您能够怎么解决这一个标题。代码在ChainedDB数据库创建了一个炫酷到SharedLoginChainedUser用户。这给SharedLogin在至极数据Curry二个小立足点,那是跨数据库全数权链接不奇怪干活索要的。为了注解SharedLoginAlaskaCity表上未有SELECT许可,代码尝试从AlaskaCity直白读取数据。但特别尝试失利了,因为SharedLoginChainedUserChainedDB其余对象上平素不获准。

 1 USE ChainedDB;
 2 GO
 3 CREATE USER ChainedUser FOR LOGIN SharedLogin;
 4 -- Note that we're not granting the user any permissions in the chained database.
 5 GO
 6 -- Verify that SharedLogin doesn't have direct access to the AlaskaCity table, even in the ChainedDB database context.
 7 EXECUTE AS LOGIN = 'SharedLogin';
 8 SELECT * FROM dbo.AlaskaCity;
 9 GO
10 REVERT;

代码7.8:成立映射到在ChainedDBSharedLogin的顾客,但不曾其余许可,能够通过尝试从AlaskaCity查询数据

图片 5

这段日子您能够执行代码7.7,最终从视图里成功收获数据。

你能够表明跨数据库全体权已经启用,就算接收大面积对象全体权,顾客在能够何况做客八个数据库。你能够选拔低呢7.9闭馆跨数据库全数权链接——实际上你假使运转当中三个就可以,因为独有2个数据库都以启用,跨数据库全数权链接才足以平常干活——然后再一次运转代码7.7.此次你会拿走刚才相仿的不当。

1 ALTER DATABASE ChainedDB SET DB_CHAINING OFF;
2 ALTER DATABASE SourceDB SET DB_CHAINING OFF;
3 GO

代码7.9:对2个数据库关闭跨数据库全体权链接

图片 6

那是跨数据库全体权链接要征服的谬误。