Vérification de L'existence d'une connexion au serveur SQL

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

j'ai trouvé le code suivant pour ajouter réellement le login à la base de données, mais je veux envelopper ceci 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 pas sûr où commencer!

146
demandé sur LarsH 2009-09-04 17:57:15

9 réponses

à Partir 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
122
répondu Johnno Nolan 2018-01-18 16:05:23

Voici une façon de faire cela dans SQL Server 2005 et plus tard sans utiliser la vue syslogins dépréciée:

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 Liste pas les logins Windows.

si vous devez vérifier l'existence d'un utilisateur dans une base de données particulière avant de les créer, alors vous pouvez le faire:

USE your_db_name

IF NOT EXISTS
    (SELECT name
     FROM sys.database_principals
     WHERE name = 'Bob')
BEGIN
    CREATE USER [Bob] FOR LOGIN [Bob] 
END
261
répondu Derek Morrison 2011-06-29 06:28:49

comme un ajout mineur à ce fil, en général, vous voulez éviter d'utiliser les vues qui commencent par sys.sys* as Microsoft ne les inclut que pour la rétrocompatibilité. Pour votre code, vous devriez probablement utiliser sys.server_principals. Cela suppose que vous utilisez SQL 2005 ou plus.

28
répondu Bomlin 2009-09-04 14:09:57

essayez ceci (remplacez 'user' par le nom de connexion actuel):

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

BEGIN 
    --create login here
END
7
répondu Marc 2009-09-04 14:05:21

cela fonctionne sur SQL Server 2000.

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

sur SQL 2005, changer la 2ème ligne en

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

Je ne suis pas sûr à propos de SQL 2008, mais je devine qu'il sera le même que SQL 2005 et si non, cela devrait vous donner une idée de l'endroit où commencer à chercher.

5
répondu David 2009-09-04 14:04:02

qu'est-ce que vous voulez exactement vérifier pour le login ou l'utilisateur ? un login est créé au niveau du serveur et un utilisateur est créé au niveau de la base de données de sorte qu'un login est unique dans le serveur

aussi un utilisateur est créé contre un login, un utilisateur sans login est un utilisateur orphelin et n'est pas utile car l'utilisateur ne peut pas effectuer de login sql serveur sans un login

peut-être que vous en avez besoin

vérifier l'ouverture de session

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

la requête ci-dessus de retour de " X " si la connexion existe else return null

puis créer un login

CREATE LOGIN <username> with PASSWORD=<password>

crée une connexion dans sql server .mais il n'accepte que les mots de passe forts

créer un utilisateur dans chaque base de données que vous voulez pour vous connecter comme

CREATE USER <username> for login <username>

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

 GRANT EXECUTE TO <username>

VOUS DEVEZ disposer des autorisations de SYSADMIN ou de dire " sa " à court

vous pouvez ecrire 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
répondu Akshita 2011-09-29 09:54:07

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

3
répondu Hüda 2018-01-31 10:17:15

C'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 la base de données SQL Azure

0
répondu Vinicius 2018-05-15 15:10:07

vous devez d'abord vérifier l'existence d'une connexion en utilisant syslogins view:

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

alors vous devez vérifier l'existence de votre base de données:

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
-1
répondu M.Alaghemand 2016-12-31 00:50:52