SQL Serverログインが既に存在するかどうかのチェック
-
21-09-2019 - |
質問
私は、特定のログインがすでに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
後者は、Windowsのログインをリストしていないため、server_principals表示ではなくsql_loginsのに使用されます。
あなたがそれらを作成する前に、特定のデータベース内のユーザの存在を確認する必要がある場合は、あなたがこれを行うことができます:
USE your_db_name
IF NOT EXISTS
(SELECT name
FROM sys.database_principals
WHERE name = 'Bob')
BEGIN
CREATE USER [Bob] FOR LOGIN [Bob]
END
は、このスレッドにマイナーな追加として、一般的には、Microsoftが唯一の後方互換性のためにそれらを含めているとして* sys.sysで始まるビューを使用しないようにしたいです。あなたのコードのために、あなたはおそらくsys.server_principalsを使用する必要があります。これは、SQL 2005以降を使用していると仮定されます。
これは(実際のログイン名に 'ユーザー' を置き換え)してみます:
IF NOT EXISTS(
SELECT name
FROM [master].[sys].[syslogins]
WHERE NAME = 'user')
BEGIN
--create login here
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する
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と同じになることを推測しているとされていない場合は、これはあなたにtは探し始める場所のアイデアを与える必要があります。
あなたは正確にログインまたはユーザーのチェックを何をしたいしていますか? ログインはサーバーレベルで作成され、ログインがサーバー内で一意であるように、ユーザーは、データベース・レベルで作成されます。
は、ユーザーがログインに対して作成され、ログインせずにユーザーが孤立したユーザーであり、uは、ログイン
せずにSQL Serverのログインを行っカントとして有用ではありません多分uはこれを必要とする
ログイン
のチェックselect 'X' from master.dbo.syslogins where loginname=<username>
上記のクエリの戻り「X」のログインが他のリターンが存在する場合はnull
その後、ログインを作成
CREATE LOGIN <username> with PASSWORD=<password>
それが受け入れ.but これは、SQL Serverのログインを作成するだけで強力なパスワード
としてログインのためにしたい各データベースにユーザーを作成します
CREATE USER <username> for login <username>
割り当て、ユーザーに実行権限を
GRANT EXECUTE TO <username>
YOUは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>];
に存在するかどうか まず、あなたが見るの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