[sql-server] SQL Server 로그인이 이미 있는지 확인

특정 로그인이 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

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


답변

이 스레드에 사소한 추가 사항으로, 일반적으로 Microsoft는 이전 버전과의 호환성을 위해 sys.sys *로 시작하는보기를 사용하지 않기를 원합니다. 코드에는 아마도 sys.server_principals를 사용해야합니다. 이것은 SQL 2005 이상을 사용한다고 가정합니다.


답변

내장 기능을 사용할 수 있습니다 :

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


답변

이것을 시도하십시오 (실제 로그인 이름으로 ‘user’를 대체하십시오).

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에서 두 번째 줄을

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

SQL 2008에 대해 잘 모르겠지만 SQL 2005와 동일 할 것으로 예상되며 그렇지 않은 경우 어디에서 시작하는지에 대한 아이디어를 제공해야합니다.


답변

정확히 로그인 또는 사용자 확인을 원하십니까? 서버 레벨에서 로그인이 작성되고 데이터베이스 레벨에서 사용자가 작성되므로 서버에서 로그인이 고유합니다.

또한 사용자가 로그인에 대해 생성되고 로그인이없는 사용자는 고아 사용자이며 로그인하지 않고 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