programing

SQL Server 로그인이 이미 있는지 확인하는 중

mbctv 2023. 4. 6. 22:56
반응형

SQL Server 로그인이 이미 있는지 확인하는 중

SQL Server에 특정 로그인이 이미 존재하는지 확인하고 존재하지 않으면 추가해야 합니다.

데이터베이스에 로그인을 실제로 추가하기 위해 다음 코드를 찾았는데, 먼저 로그인이 존재하는지 확인하기 위해 IF 스테이트먼트(어느 정도)로 이 코드를 랩하고 싶습니다.

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

시스템 데이터베이스를 조회해야 한다는 것은 알지만 어디서부터 시작해야 할지 모르겠어요!

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 대신 사용됩니다.이것은 server_principals 뷰는 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

여기서부터

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

이 스레드에 대한 사소한 추가로서 일반적으로 sys.sys*로 시작하는 뷰는 사용하지 않는 것이 좋습니다.이는 Microsoft가 이전 버전과의 호환성을 위해서만 포함되기 때문입니다.코드에는 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

로그인, 역할, 사용자 간에 이름 경합을 일으키기 위해체크해 주세요.typeMicrosoft sys.database_principals 매뉴얼에 따른 컬럼

사용자 이름 등의 특수 문자를 취급하려면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>]

SQL은 SQL Server 2005, 2008, 2008 R2, 2014, 2016, 2017, 2019에서 테스트됩니다.

다음을 시도해 보십시오('user'를 실제 로그인 이름으로 바꿉니다).

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

BEGIN 
    --create login here
END

이것은 Azure SQL용입니다.

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

출처: 데이터베이스 사용자가 Azure SQL 데이터베이스에 이미 존재하는지 확인하는 방법

이 기능은 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 서버에 로그인을 생성하지만 강력한 비밀번호만 받아들입니다.

로그인을 위해 각 데이터베이스에 사용자를 만듭니다.

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

SQL 2016 시작:

DROP USER IF EXISTS [userName]

CREATE USER [userName] FOR LOGIN [loginName]

먼저 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

언급URL : https://stackoverflow.com/questions/1379437/checking-if-a-sql-server-login-already-exists

반응형