特定のログインがSQL Serverに既に存在するかどうかを確認する必要があり、存在しない場合は追加する必要があります。
実際にデータベースにログインを追加する次のコードを見つけましたが、これをIFステートメントでラップし(何らかの方法で)、ログインが最初に存在するかどうかを確認します。
CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword',
DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
GO
システムデータベースに問い合わせる必要があることは理解していますが、どこから始めればよいかわかりません。
ここ から
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
非推奨の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
このスレッドへのマイナーな追加として、一般的には、sys.sys *で始まるビューの使用は避けたいと思います。Microsoftは下位互換性のためにそれらを含むだけだからです。コードには、おそらくsys.server_principalsを使用する必要があります。これは、SQL 2005以降を使用していることを前提としています。
組み込み関数を使用できます。
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
これを試してください(「ユーザー」を実際のログイン名に置き換えてください):
IF NOT EXISTS(
SELECT name
FROM [master].[sys].[syslogins]
WHERE NAME = 'user')
BEGIN
--create login here
END
これは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と同じになると思います。そうでない場合は、これからどこから探し始めるのかがわかります。
ログインまたはユーザーを正確に確認したいものは何ですか?ログインはサーバーレベルで作成され、ユーザーはデータベースレベルで作成されるため、ログインはサーバー内で一意です
また、ユーザーはログインに対して作成されますが、ログインしていないユーザーは孤立したユーザーであり、ログインせずに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
これはAzure SQL用です。
IF (EXISTS(SELECT TOP 1 1 FROM sys.sql_logins WHERE [name] = '<login>'))
DROP LOGIN [<login>];