web-dev-qa-db-fra.com

Vérifier si une connexion SQL Server existe déjà

Je dois vérifier si un identifiant spécifique existe déjà sur SQL Server, et si ce n'est pas le cas, je dois l'ajouter.

J'ai trouvé le code suivant pour réellement ajouter le login à la base de données, mais je veux le placer dans une instruction IF (en quelque sorte) pour vérifier si le login existe en premier.

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

Je comprends que je dois interroger une base de données système, mais je ne sais pas par où commencer!

149
Brett Rigby

De ici

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
126
Johnno Nolan

Voici une façon de procéder dans SQL Server 2005 et versions ultérieures sans utiliser la vue syslogins obsolète:

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

La vue server_principals est utilisée à la place de sql_logins car ce dernier ne répertorie pas les connexions Windows.

Si vous devez vérifier l'existence d'un utilisateur dans une base de données particulière avant de les créer, procédez comme suit:

USE your_db_name

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

En tant que complément mineur à ce fil, vous souhaitez en général éviter d'utiliser les vues commençant par sys.sys *, car Microsoft ne les inclut que pour des raisons de compatibilité avec les versions antérieures. Pour votre code, vous devriez probablement utiliser sys.server_principals. Cela suppose que vous utilisez SQL 2005 ou une version ultérieure.

28
Bomlin

Essayez ceci (remplacez 'utilisateur' par le nom d'utilisateur actuel):

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

BEGIN 
    --create login here
END
7
Marc

Cela fonctionne sur SQL Server 2000.

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

sur SQL 2005, modifiez la 2ème ligne en 

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

Je ne suis pas sûr de SQL 2008, mais je suppose que ce sera la même chose que SQL 2005 et si ce n’est pas le cas, cela devrait vous donner une idée de l'endroit où commencer à chercher.

5
David

Vous pouvez utiliser la fonction intégrée:

SUSER_ID ( [ 'myUsername' ] )

via

IF [value] IS NULL [statement]

comme:

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

4
Hüda

que voulez-vous exactement vérifier votre identifiant ou votre utilisateur? un identifiant est créé au niveau du serveur et un utilisateur est créé au niveau de la base de données, de sorte qu'un identifiant est unique sur le serveur

de plus, un utilisateur est créé avec un login, un utilisateur sans login est un utilisateur orphelin et n’est donc pas utile car vous ne pouvez pas vous connecter au serveur SQL sans vous connecter.

peut-être que tu as besoin de ça

vérifier la connexion 

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

la requête ci-dessus retourne 'X' si le login existe, sinon retourne null

puis créer un identifiant

CREATE LOGIN <username> with PASSWORD=<password>

cela crée une connexion sur le serveur SQL .mais il n'accepte que les mots de passe forts

créer un utilisateur dans chaque base de données que vous souhaitez utiliser pour vous connecter

CREATE USER <username> for login <username>

attribuer des droits d'exécution à l'utilisateur 

 GRANT EXECUTE TO <username>

VOUS DEVEZ AVOIR les autorisations SYSADMIN ou dire 'sa' pour faire court

vous pouvez écrire une procédure SQL pour cela sur une base de données

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
4
Akshita

Ceci est pour Azure SQL:

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

Source: Comment vérifier si un utilisateur de base de données existe déjà dans Azure SQL Database

0
Vinicius