SQL2008无法附加数据库,登录和用户

2020-01-01 作者:数据库资讯   |   浏览(68)

SQL2008无法附加数据库,提示“无法显示请求的对话框”(nColIndex实际值是-1)图文解决方法

授予权限的思路,可以用一句话来概括,那就是:授予 Principal 操作 Securable 的 Permission,在多数文档中,把 Principal 翻译为安全主体,Securable翻译为安全对象,Permission翻译为权限,授予权限的子句细分为三部分:Permission,Securable 和 Principal。最让人疑惑的是Principal和Securable,这两个概念有时候会相互转换。

SQL2008无法附加数据库,提示“无法显示请求的对话框”(nColIndex实际值是-1)图文解决方法 

Grants permissions on a securable to a principal

 

Principal是被授予权限的实体,包括login、user、role等,Securable是Principal操作的对象,可以是table、view、SP、函数等,也可以是login、user、role等对象;有时Principal会作为Securable,被Principal操纵,也就是说,Principal 是抽象意义上的安全主体,可以向安全主体授予权限,Principal分为Server level和Database level,最重要的两个Principal是Login和User,他们的区别是:

 

  • 登录名(Login)是Server级别的Principal,作用域是整个数据库引擎。若要连接 SQL Server 实例上的特定数据库,登录名必须映射到数据库用户。数据库内的权限是向数据库用户而不是登录名授予的。
  • 数据库用户(User)是数据库级别的Principal,作用域是数据库,登录名必须映射到数据库用户才能连接到数据库。一个登录名可以作为不同用户映射到不同的数据库,但在每个数据库中只能作为一个用户进行映射。

今天,我在工作室换了一台电脑写Code,当我在附加数据库的时候,出现如下异常,折腾了半天,还是不行。于是我就重装SQL,重装之后还是不行。纠结了,当时我也忘记去google,傻傻的就把系统重装了(新机)。折腾差不多一天之后,系统、SQL、VS2010、补丁等等全都搞定之后,总算“大功告成了”,这个时候,我又跑去附加数据库。这回蛋疼了~~依然是失败。于是乎,有了这篇文章(好记性不如烂笔头):

Login和User最基本的区别是Login用于控制用户是否有权限登陆SQL Server实例,User用于用户控制是否有权限访问数据库:

 

  • Login是登陆SQL Server的凭证,验证方式有两种,Windows 验证和SQL Server 验证。
  • User用于访问数据库,使用Login登陆到SQL Server实例之后,必须映射到User,才能访问数据库。
  • Login提供登录Server的帐号和密码,User用于访问数据库,Role是权限的集合,控制User访问的资源。User只有担当某一个角色或具有某些权限,才能访问数据库。
  • 创建Login之后,该Login能够登录到SQL Server实例,但是,仅仅被授予Public角色,在访问数据库时,必须基于Login创建相应的数据库用户(User),Login和User通过SID关联。

出现错误 

一,创建Login

 

根据验证类型,Login分为SQL Server登录和Windows域登录,在创建登录时,可以设置默认数据库(Default Database),指定Login登录的默认数据库,默认值是master数据库。

 

1,创建SQL Server 登录

 图片 1

CREATE LOGIN login_name 
WITH PASSWORD = { 'password' }
,DEFAULT_DATABASE = database

 

2,创建Windows域登录

这个是由于权限不足导致的,我们必须在【本地账号】的SQL中,新建一个【域帐号】的SQL用户,设置完成之后,还需要手动分配权限。详情如下:

如果创建Windows域登录,映射到一个Windows域账户,登录名必须使用Windows域格式: [<domainName><login_name>].

 

CREATE LOGIN [<domain_Name><login_name>] 
FROM WINDOWS
WITH DEFAULT_DATABASE = database

解决方法

二,创建数据库用户(User)

 

在SQL Server中,通常情况下,User的创建都是基于master 数据库中的Login,该Login的来源有三种:基于Windows 域用户,Windows 域用户组,或SQL Server 验证。

 图片 2

1,创建User

01、回到你系统的本地账号,然后登陆你的SQL,我这篇文章以登录(.)为例,如果你想登陆(.SQLEXPRESS),方法也一样,不做解释。

CREATE USER user_name 
FOR LOGIN login_name 
WITH DEFAULT_SCHEMA = schema_name 

 

参数解释:

图片 3 

  • user_name:是创建的数据库用户的名字,该名字在数据库中是唯一的,用于唯一标识一个用户;
  • login_name:是用户登录SQL Server实例的登录名,分为Windows域登录名和SQL Server登录名。Windows域登录名的格式是:[<domainName><loginName>] 通过SID将登录名(Login)和用户名(User)关联在一起。
  • WITH DEFAULT_SCHEMA = schema_name:指定用户默认的架构(Schema),默认的Schema是指用户在引用数据库对象时,如果省略框架名,那么SQL Server将首先从默认框架下进行查找数据库对象。

02、安全性——登录名——右键,新建登录名...

在创建新的用户时,没有指定用户默认的架构,有三种处理方式:

 

  • 如果该用户是某一个Windows 用户组的成员,该组有默认的架构,那么该用户默认的架构是组的默认架构;
  • 对于sysadmin角色(Fixed Server Role)的成员,其默认的架构始终是dbo,忽略Create User命令的设置;
  • 如果用户不属于组,也不是sysadmin角色的成员,SQL Server不能确定该用户的架构,设置默认的架构名dbo;

图片 4

2,创建用户名,基于SQL Server登录

03、常规——搜索——位置。(特别说明下,由于我的工作室是局域网工作的,不连外网。我们在需要连接外网时,需要自己再手动修改IP。我今天忘记把网络改回局域网,所以点击“位置”之后,找不到域用户,这点希望大家注意,不要和我一样犯错了,嘻嘻) 

CREATE LOGIN WanidaBenshoof 
WITH PASSWORD = '8fdKJl3$nlNv3049jsKK';
USE AdventureWorks2012;
go
CREATE USER Wanida 
FOR LOGIN WanidaBenshoof 
WITH DEFAULT_SCHEMA = Marketing;

 

3,创建用户名,基于Windows 域登录** **

 图片 5

CREATE USER [Domain1WindowsUserBarry] 
FOR LOGIN [Domain1WindowsUserBarry];
use database_name
go
CREATE USER [Domain1WindowsGroupManagers] 
FOR LOGIN [Domain1WindowsGroupManagers];

04、登陆你的域帐号 

三,模拟权限

 

在SQL Server的安全模型中,模拟(IMPERSONATE )权限的安全对象是User或Login,被授予者(grantee )有权限模拟特定用户的安全上下文执行特定的操作。

图片 6 

例如,user1授予模拟user2的权限,当user2的安全上下文有足够的权限,而user1没有时,通过权限模拟,user1能够在user2的权限上下文中执行查询请求:

05、选择你要的网络位置,例如:整个目录

GRANT IMPERSONATE 
ON USER:: user2 
TO user1;

 

通过执行EXECUTE AS 命令模拟用户的权限,用户user1就运行在user2的安全上下文中,例如,user1在登陆数据库之后,模拟user2的权限:

图片 7 

EXECUTE AS USER = 'user2';

06、选择之后,点击“高级”

通过执行 REVERT 命令退出权限模拟,返回到用户原始的安全上下文中:

 

REVERT;

 图片 8

四,用户和组

07、立即查找——选择你要的那个域用户

SQL Server 可以创建一个Windows Group作为登陆和用户(User),所有属于该组的成员,都具有相同的权限。

 

1,列出组的所有成员

图片 9 

在当数据库中,查看某一个Security Group的所有成员:

08、选好之后,如上图(我用白色背景涂抹了部分文字)——确定

exec master..xp_logininfo 
    @acctname = 'domaingroup',
    @option = 'members'

 

2,检查组的成员

图片 10 

当前数据库中,检查当前的用户是否属于特定的Security Group:

09、到了这一步,我们已经添加了一个用户了。 

select is_member('domaingroup')

图片 11 

函数is_member的返回值是:

10、现在,我们需要【双击】刚才添加的用户,查看属性 ——常规——设置那个账号的密码,改成上图那样。

  • 0:当前的用户(User)不是组的成员;
  • 1:当前的用户(User)是组的成员;
  • NULL:组名或角色名不存在于当前的数据库中;

 

注意,数据库是当前的数据库,如果用于资源管理(Resource Governor)中的分类函数(Classifier Function),那么,要注意分类函数所在的数据库,如果分类函数创建于master数据库,那么is_member函数的当前数据库就是master,检查的结果是当前用户是否属于当前数据库的组或角色。

 图片 12

五,特殊的用户

11、服务器角色——改成上图(可根据自己需要适当勾选) 

SQL Server在每个数据库中都内置两个特殊的用户:dboguest,在每个数据库中都有这两个用户(User):

 

  • dbodatabase owner的简称):是数据库的所有者(Owner),SQL Server把固定服务器角色 sysadmin 的成员,固定数据库db_owner角色的成员,sa登陆,都映射到数据库用户 dbo上。
  • guest:是顾客,SQL Server 允许任何没有映射到数据库用户的有效登陆(Login),使用guest账户登陆数据库。在登陆数据库之前,要求dbo分配权限给guest, 一般给他查看的权限select。

图片 13 

 当一个Login登陆到SQL Server之后,如果没有在数据库中映射相应的用户,那么该Login可以使用guest用户登陆数据库。guest用户默认存在每个数据库中,默认情况下,guest用户是禁用的,可以通过命令启用guest用户。

12、用户映射——配分角色(可根据自己需要适当勾选) 

GRANT CONNECT TO GUEST

 

一旦启用guest用户,所有可以登陆到SQL Server的Login,都可以使用guest身份来访问数据库,并拥有guest用户的权限。可以通过命令禁用guest用户:

图片 14 

REVOKE CONNECT FROM GUEST;

13、到了第12步,我们已经做完所有工作了。这个时候求换系统帐号,登录域用户,发现已经可以使用了。成功打开了附加数据库的界面。

注意:只能在 master 和 tempdb 以外的数据库中执行禁用GUEST帐号的操作,这是因为许多用户都需要以GUEST身份访问master 和 tempdb系统数据库,GUEST用户在master 和 tempdb数据库的权限被严格限制。

另外两个特殊的用户:INFORMATION_SCHEMA 和 sys,每个数据库都包含这两个用户,这两个用于是数据库引擎内部使用,不能被修改和删除。

 

参考文档:

Principals (Database Engine)

EXECUTE AS Clause (Transact-SQL).aspx)

SQL Server用户GUEST的简要介绍

本文由yzc216亚洲城发布于数据库资讯,转载请注明出处:SQL2008无法附加数据库,登录和用户

关键词: yzc216亚洲城 www.yzc216.c