web-dev-qa-db-ja.com

SQL Serverログインが既に存在するかどうかを確認する

特定のログインがSQL Serverに既に存在するかどうかを確認する必要があり、存在しない場合は追加する必要があります。

実際にデータベースにログインを追加する次のコードを見つけましたが、これをIFステートメントでラップし(何らかの方法で)、ログインが最初に存在するかどうかを確認します。

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

システムデータベースに問い合わせる必要があることは理解していますが、どこから始めればよいかわかりません。

157
Brett Rigby

ここ から

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
129
Johnno Nolan

非推奨のsysloginsビューを使用せずにSQL Server 2005以降でこれを行う方法を次に示します。

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

Sql_loginsはWindowsログインをリストしないため、sql_loginsの代わりにserver_principalsビューが使用されます。

ユーザーを作成する前に、特定のデータベース内のユーザーの存在を確認する必要がある場合は、次の操作を実行できます。

USE your_db_name

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

このスレッドへのマイナーな追加として、一般的には、sys.sys *で始まるビューの使用は避けたいと思います。Microsoftは下位互換性のためにそれらを含むだけだからです。コードには、おそらくsys.server_principalsを使用する必要があります。これは、SQL 2005以降を使用していることを前提としています。

28
Bomlin

組み込み関数を使用できます。

SUSER_ID ( [ 'myUsername' ] )

via

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

7
Hüda

これを試してください(「ユーザー」を実際のログイン名に置き換えてください):

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

BEGIN 
    --create login here
END
7
Marc

これはSQL Server 2000で機能します。

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

sQL 2005では、2行目を次のように変更します

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

SQL 2008についてはわかりませんが、SQL 2005と同じになると思います。そうでない場合は、これからどこから探し始めるのかがわかります。

5
David

ログインまたはユーザーを正確に確認したいものは何ですか?ログインはサーバーレベルで作成され、ユーザーはデータベースレベルで作成されるため、ログインはサーバー内で一意です

また、ユーザーはログインに対して作成されますが、ログインしていないユーザーは孤立したユーザーであり、ログインせずにSQLサーバーログインを実行することはできないため有用ではありません

多分これが必要

ログインを確認する

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

上記のクエリは、ログインが存在する場合は 'X'を返し、そうでない場合はnullを返します

その後、ログインを作成します

CREATE LOGIN <username> with PASSWORD=<password>

これにより、SQLサーバーにログインが作成されますが、強力なパスワードのみを受け入れます

ログインする各データベースにユーザーを作成します

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
4
Akshita

これはAzure SQL用です。

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

ソース: データベースユーザーがAzure SQL Databaseに既に存在するかどうかを確認する方法

0
Vinicius