Pergunta

Preciso verificar se já existe um login específico no servidor SQL e, se não o fizer, preciso adicioná -lo.

Eu encontrei o código a seguir para adicionar o login ao banco de dados, mas quero envolver isso em uma instrução IF (de alguma forma) para verificar se o login existe primeiro.

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

Entendo que preciso interrogar um banco de dados do sistema, mas não tenho certeza por onde começar!

Foi útil?

Solução

A partir de aqui

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

Outras dicas

Aqui está uma maneira de fazer isso no SQL Server 2005 e mais tarde sem usar a visualização de syslogins depreciada:

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

A exibição Server_Principals é usada em vez de SQL_LOGINS porque o último não liste os logins do Windows.

Se você precisar verificar a existência de um usuário em um banco de dados específico antes de criá -lo, poderá fazer isso:

USE your_db_name

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

Como uma pequena adição a este thread, em geral você deseja evitar o uso das visualizações que começam com o SYS.SYS*, pois a Microsoft os inclui apenas para compatibilidade com versões anteriores. Para o seu código, você provavelmente deve usar o sys.server_principals. Isso assume que você está usando o SQL 2005 ou maior.

Experimente isso (substitua 'Usuário' pelo nome de login real):

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

BEGIN 
    --create login here
END

Você pode usar a função interna:

SUSER_ID ( [ 'myUsername' ] )

através da

IF [value] IS NULL [statement]

Curti:

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

Isso funciona no SQL Server 2000.

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

em SQL 2005, mude a 2ª linha para

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

Não tenho certeza sobre o SQL 2008, mas acho que será o mesmo que o SQL 2005 e, se não, isso deve lhe dar uma idéia de onde o não está procurando.

O que você deseja exatamente verificar o login ou o usuário? Um login é criado no nível do servidor e um usuário é criado no nível do banco de dados, para que um login seja único no servidor

Além disso, um usuário é criado contra um login, um usuário sem login é um usuário órfão e não é útil, pois você não pode executar o login do SQL Server sem um login

Talvez você precise disso

Verifique se há login

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

a consulta acima retorna 'x' se houver login mais retornar nulo

Em seguida, crie um login

CREATE LOGIN <username> with PASSWORD=<password>

Isso cria um login no servidor SQL. Mas ele aceita apenas senhas fortes

Crie um usuário em cada banco de dados que você deseja para fazer login como

CREATE USER <username> for login <username>

Atribuir direitos de execução ao usuário

 GRANT EXECUTE TO <username>

Você deve ter permissões de sysadmin ou dizer 'sa' para curta

Você pode escrever um procedimento SQL para isso em um banco de dados

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

Isto é para o Azure SQL:

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

Fonte: Como verificar se o usuário do banco de dados já existe no banco de dados do Azure SQL

Primeiro, você deve verificar a existência de login usando a exibição de syslogins:

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

Então você deve verificar sua existência de banco de dados:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top