4

我对登录名和用户感到困惑。我在文章中发现以下内容:“登录”授予主体进入服务器的权限。“用户”将登录条目授予单个数据库。一个“登录”可以与多个用户相关联(每个数据库一个)。

理论上我可以理解。但是,我想我可能没有实际理解这一点。

我通过右键单击 SERVERNAME=>SECURITY=>LOGIN 在我的 SQL Server 2008 管理工作室中创建了一个登录名。默认数据库是“master”。现在,我可以使用这个登录名和密码登录到 sql server。我注意到,如果我将登录属性中的默认数据库更改为特定数据库,我将无法使用此凭据再次登录。我恢复为“大师”并且它有效。这里发生了什么?

另外,为什么我们需要用户?我通过右键单击 DATABASENAME=>SECURITY=>USERS 创建了一个用户。我无法使用此用户凭据重新登录。那么,我们需要这个的目的是什么。我可以理解这个答案的理论,但我需要更多的解释才能理解。

另外,我是 .net 开发人员,所以我想知道 sql 连接字符串中提供的凭据是什么。他们是登录名还是用户,或者可以是其中任何一个?

4

2 回答 2

4

最简单的解释是 SQL Server 登录让您进入服务器,并且该登录的设置控制它在每个数据库中的工作方式。

暂时不要担心数据库登录。您已经转到 SERVERNAME=>SECURITY=>LOGIN。让我们看看您如何使用此登录名 - 如果您已经创建了登录名,请右键单击并进入属性。在角色下查看 - 服务器上有许多具有不同用途的不同角色。但是对于一个app来说,一般来说,普通用户应该只有Public角色。

至于数据库登录,您可以转到映射部分,将您的登录指向它需要访问的任何数据库。当您将登录名映射到数据库时,这会创建您在 DATABASENAME=>SECURITY=>USERS 下看到的数据库登录名(如果它尚不存在)。映射是最重要的部分,它实际上使登录能够查看数据库中的数据。

对于应用程序,您使用的是服务器登录。如果您在映射中设置了指向所需数据库的链接,那么您实际上不需要考虑数据库级别的登录信息。

于 2013-09-07T03:01:14.003 回答
1

登录只存在于服务器级别,这就是它自动映射到主数据库的原因。

用户控制对单个数据库的访问。创建用户时,可以将其映射到登录名(有关语法,请参阅MSDN 上的创建用户)。如果您在数据库中创建一个映射到登录名的用户,您可以将其设置为默认值并登录。

这样做的一个原因是允许多租户环境,其中单个服务器托管许多数据库,并非每个可以访问该服务器的人都应该能够访问。例如,假设我们为公司 A 和公司 B 提供服务,并且我们在同一台服务器上为每个公司托管数据库。我们不希望 A 公司的某个人(或者,更重要的是,一个泄露了 A 公司某人的凭据的人)能够访问 B 公司的数据,因此我们只为 A 公司登录创建一个用户A公司数据库。这是一个简短的代码设置供您试验:

-- This script assumes whoever is running it has sysadmin permissions on the instance of
-- SQL Server on which it is running. Do not run this on a production instance.

-- Create a database for each company on the server instance.
create database CompanyA;
create database CompanyB;
go

-- Create a login for each company on the server instance.
-- SQL Server integrated security has it's issues, but it's useful for an example like this.
create login CompanyA_Login with password = 'pa55wOrd1', default_database = CompanyA;
create login CompanyB_Login with password = 'pa55wOrd2', default_database = CompanyB;
go

-- Create a user in the appropriate database for each login.
-- We need to tell the server that we want to use a specific database
use CompanyA;
create user CompanyA_User for login CompanyA_Login;
-- We're granting it dbo for the purposes of our example here;
-- a broad permission set like that is a bad practice.
alter role db_owner add member CompanyA_User;
go

-- Repeat the process...
use CompanyB;
create user CompanyB_User for login CompanyB_Login;
alter role db_owner add member CompanyB_User;
go

-- Create a table in each database and populate it with some data.
use CompanyA;
create table dbo.sensitiveInformation
(
    sensitiveInformation    NVARCHAR(50)    NOT NULL
);

insert dbo.sensitiveInformation (sensitiveInformation)
values ('Oh man, it would be bad if this got out!');
go

use CompanyB;
create table dbo.sensitiveInformation
(
    sensitiveInformation    NVARCHAR(50)    NOT NULL
);

insert dbo.sensitiveInformation (sensitiveInformation)
values ('Oh man, it would be even worse if THIS got out!');
go

-- Now, feel free to log in as either user and see what you can and can't do.
-- You will find that the CompanyA_Login will never be able to access CompanyB's
-- data and vice versa. This allows for secure multi-tenant environments.

-- Once you're done playing around, we'll clean up our samples.
use CompanyB;
drop table dbo.sensitiveInformation;
drop user CompanyB_User;
go

use CompanyA;
drop table dbo.sensitiveInformation;
drop user CompanyA_User;
go

use master;
drop login CompanyB_Login;
drop login CompanyA_Login;

drop database CompanyB;
drop database CompanyA;

如果您需要单独的、离散的安全/权限集,并且需要一个用户拥有多个这些集,那么您需要使用数据库角色。Tech Republic 的这篇文章很好地说明了角色的好处,尽管我建议您查看 MSDN 以了解创建角色的最新方法。

于 2015-06-25T23:29:14.030 回答