检查SQL Server登录是否已存在

时间:2009-09-04 13:57:15

标签: sql-server login

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

我找到了以下代码来实际添加登录到数据库,但是我想将它包装在IF语句中(不知何故)以检查登录是否存在。

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

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

11 个答案:

答案 0 :(得分:270)

这是在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

答案 1 :(得分:128)

来自here

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

答案 2 :(得分:28)

作为此线程的次要补充,通常您希望避免使用以sys.sys *开头的视图,因为Microsoft仅包含它们以实现向后兼容性。对于您的代码,您应该使用sys.server_principals。这假设您使用的是SQL 2005或更高版本。

答案 3 :(得分:7)

尝试此操作(将'user'替换为实际的登录名):

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

BEGIN 
    --create login here
END

答案 4 :(得分:7)

您可以使用内置功能:

 <?php
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Input;

 class ApplicationController extends FrontController {
  public function getSupplierApplication() {
      return self::getPage('supply-us/application');
  }

 public function processSupplierApplication(Request $req) {
     if (!$req->get('Company')==null) {
      $company = $req->get('Company');
   return response()->json($company);
  }else{
    $company="no input give";
   return response()->json($company);
   }
}

经由

SUSER_ID ( [ 'myUsername' ] )

像:

IF [value] IS NULL [statement]

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

答案 5 :(得分:5)

这适用于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一样,如果没有,这会让你知道从哪里开始看。

答案 6 :(得分:4)

你究竟想要检查登录或用户是什么? 在服务器级别创建登录,并在数据库级别创建用户,因此登录在服务器

中是唯一的

也是针对登录创建的用户,没有登录的用户是孤立用户并且没有用,因为你无法在没有登录的情况下执行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>

你必须拥有SYSADMIN权限或简称'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

答案 7 :(得分:1)

为了处理登录名,角色,用户等之间的命名冲突,您应该根据Microsoft sys.database_principals documentation来检查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>]

答案 8 :(得分:0)

这适用于Azure SQL:

@page
@model Project.Pages.LiveChatModel
@{
    ViewData["Title"] = "LiveChat";
    Layout = "~/Pages/_LoggedIn.cshtml";
}
<div class="container">
    <h2>Live Chat</h2>
    <div id="enterName">
        Enter your name: <input type="text" id="name" />
        <button id="btnName">Save</button>
    </div>
    <div id="currentName">
        Your Name:
    </div>
    <div id="supportName">
        Support Name: Jeff
    </div>
    Chat History
    <div id="messages">

    </div>
    <div>
        <textarea id="message" name="Message" cols="100"></textarea> 
<button id="sendMessage">Send</button>
    </div>
</div>

来源:How to check whether database user already exists in Azure SQL Database

答案 9 :(得分:0)

启动 SQL 2016:

DROP USER IF EXISTS [userName]

CREATE USER [userName] FOR LOGIN [loginName]

答案 10 :(得分:-1)

首先,您必须使用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