检查SQL Server登录是否已经存在

我需要检查SQL Server上是否已经存在特定的登录,如果不存在,那么我需要添加它。

我已经找到了下面的代码来实际添加登录到数据库,但我想用IF语句(以某种方式)来检查登录是否首先存在。

CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword',
DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
GO

我知道我需要查询一个系统数据库,但不确定从哪里开始!

217894 次浏览

在这里

If not Exists (select loginname from master.dbo.syslogins
where name = @loginName and dbname = 'PUBS')
Begin
Select @SqlStatement = 'CREATE LOGIN ' + QUOTENAME(@loginName) + '
FROM WINDOWS WITH DEFAULT_DATABASE=[PUBS], DEFAULT_LANGUAGE=[us_english]')


EXEC sp_executesql @SqlStatement
End

这适用于SQL Server 2000。

use master
select count(*) From sysxlogins WHERE NAME = 'myUsername'

在SQL 2005上,将第二行更改为

select count(*) From syslogins WHERE NAME = 'myUsername'

我不确定SQL 2008,但我猜它将是相同的SQL 2005,如果不是,这应该给你一个想法,从哪里开始寻找。

试试这个(用实际的登录名替换'user'):

IF NOT EXISTS(
SELECT name
FROM [master].[sys].[syslogins]
WHERE NAME = 'user')


BEGIN
--create login here
END

作为这个线程的一个小补充,通常您希望避免使用以sys. js开头的视图。sys*,因为微软只是为了向后兼容而包含它们。对于您的代码,您可能应该使用sys.server_principals。这是假设您使用的是SQL 2005或更高版本。

下面是一种在SQL Server 2005及以后版本中不使用已弃用的syslogins视图的方法:

IF NOT EXISTS
(SELECT name
FROM master.sys.server_principals
WHERE name = 'LoginName')
BEGIN
CREATE LOGIN [LoginName] WITH PASSWORD = N'password'
END

使用server_principals视图而不是sql_logins,因为后者没有列出Windows登录名。

如果你需要在创建一个特定的数据库之前检查一个用户是否存在,那么你可以这样做:

USE your_db_name


IF NOT EXISTS
(SELECT name
FROM sys.database_principals
WHERE name = 'Bob')
BEGIN
CREATE USER [Bob] FOR LOGIN [Bob]
END

你到底想检查登录或用户? 登录是在服务器级创建的,用户是在数据库级创建的,因此登录在服务器

中是唯一的

此外,用户是根据登录创建的,没有登录的用户是孤立用户,没有登录就不能进行SQL server登录

也许你需要这个

检查登录

select 'X' from master.dbo.syslogins where loginname=<username>

如果登录存在,则返回'X'否则返回null

然后创建一个登录

CREATE LOGIN <username> with PASSWORD=<password>

这将在SQL server中创建一个登录,但它只接受强密码

在每个数据库中创建一个用于登录的用户

CREATE USER <username> for login <username>

为用户分配执行权限

 GRANT EXECUTE TO <username>

您必须具有系统管理员权限,或者简称为“sa”

您可以为此在数据库上编写SQL过程

create proc createuser
(
@username varchar(50),
@password varchar(50)
)
as
begin
if not exists(select 'X' from master.dbo.syslogins where loginname=@username)
begin
if not exists(select 'X' from sysusers where name=@username)
begin
exec('CREATE LOGIN '+@username+' WITH PASSWORD='''+@password+'''')
exec('CREATE USER '+@username+' FOR LOGIN '+@username)
exec('GRANT EXECUTE TO '+@username)
end
end
end

首先,你必须使用syslogins视图检查是否存在登录:

IF NOT EXISTS
(SELECT name
FROM master.sys.server_principals
WHERE name = 'YourLoginName')
BEGIN
CREATE LOGIN [YourLoginName] WITH PASSWORD = N'password'
END

然后你必须检查你的数据库是否存在:

USE your_dbname


IF NOT EXISTS
(SELECT name
FROM sys.database_principals
WHERE name = 'your_dbname')
BEGIN
CREATE USER [your_dbname] FOR LOGIN [YourLoginName]
END

您可以使用内置函数:

SUSER_ID ( [ 'myUsername' ] )

通过

IF [value] IS NULL [statement]

如:

IF SUSER_ID (N'myUsername') IS NULL
CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword',
DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
GO

https://technet.microsoft.com/en-us/library/ms176042(v=sql.110).aspx

这是Azure SQL:

IF (EXISTS(SELECT TOP 1 1 FROM sys.sql_logins WHERE [name] = '<login>'))
DROP LOGIN [<login>];

来源:如何检查数据库用户是否已经存在在Azure SQL数据库

为了解决登录、角色、用户等之间的命名冲突,你应该根据微软系统。database_principals文档检查type

为了处理用户名等中的特殊字符,相应使用N'<name>'[<name>]

创建登录

USE MASTER
IF NOT EXISTS (SELECT 1 FROM master.sys.server_principals WHERE
[name] = N'<loginname>' and [type] IN ('C','E', 'G', 'K', 'S', 'U'))
CREATE LOGIN [<loginname>] <further parameters>

创建数据库用户

USE [<databasename>]
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE
[name] = N'<username>' and [type] IN ('C','E', 'G', 'K', 'S', 'U'))
CREATE USER [<username>] FOR LOGIN [<loginname>]

创建数据库角色

USE [<databasename>]
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE
[name] = N'<rolename>' and Type = 'R')
CREATE ROLE [<rolename>]

将用户添加到角色

USE [<databasename>]
EXEC sp_addrolemember N'<rolename>', N'<username>'

为角色授予权限

USE [<databasename>]
GRANT SELECT ON [<tablename>] TO [<rolename>]
GRANT UPDATE ON [<tablename>] ([<columnname>]) TO [<rolename>]
GRANT EXECUTE ON [<procedurename>] TO [<rolename>]

SQL在SQL Server 2005、2008、2008 R2、2014、2016、2017、2019上进行测试

启动SQL 2016:

DROP USER IF EXISTS [userName]


CREATE USER [userName] FOR LOGIN [loginName]