SQL服务器登录和用户

时间:2013-09-02 12:27:12

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2 sqlconnection

我对登录和用户感到困惑。我发现以下文章: “Login”将主要条目授予SERVER。 “用户”将登录条目授予单个数据库。 一个“登录”可以与许多用户相关联(每个数据库一个)。

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

暂时不要担心数据库登录。您已经转到SERVERNAME => SECURITY => LOGIN。让我们来看看你对这个登录做了什么 - 如果你已经创建了登录,请右键单击并进入属性。查看角色 - 服务器上有许多不同用途的不同用途。但对于应用程序,一般来说,普通用户应该只有公共角色。

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

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

答案 1 :(得分:1)

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

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

这样做的一个原因是允许多租户环境,其中单个服务器托管许多数据库,而不是每个可以访问服务器的人都应该能够访问。例如,假设我们向公司A和公司B提供服务,并且我们在同一服务器上为每个服务器托管数据库。我们不希望A公司的某个人(或者更重要的是,那些已经泄露了A公司某人凭据的人)能够访问B公司的数据,因此我们只为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的This article可以很好地说明角色的好处,不过我建议您查看最新创建它们的方法。