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!
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
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
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.
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
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.
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
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
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