我需要检查SQL Server上是否已存在特定登录,如果不存在,则需要添加它。
我找到了以下代码来实际添加登录到数据库,但是我想将它包装在IF语句中(不知何故)以检查登录是否存在。
CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword',
DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
GO
我知道我需要查询系统数据库,但不知道从哪里开始!
答案 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