Je travaille avec SQL Server 2012. Je veux vérifier si un utilisateur existe avant de l'ajouter à une base de données.
Voici ce que j'ai testé:
USE [MyDatabase]
GO
IF NOT EXISTS (SELECT name
FROM [sys].[server_principals]
WHERE name = N'IIS APPPOOL\MyWebApi AppPool')
Begin
CREATE USER [IIS APPPOOL\MyWebApi AppPool]
FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
Mais, ce code SELECT name FROM [sys].[server_principals]
ne revient pas si cet utilisateur existe dans MyDatabase
.
Comment puis-je vérifier si un utilisateur existe dans MyDatabase
?
Utilisation sys.database_principals
au lieu de sys.server_principals
.
Ainsi, la requête finale ressemblerait à ceci (en tenant compte du filtre utilisateur):
USE [MyDatabase]
GO
IF NOT EXISTS (SELECT [name]
FROM [sys].[database_principals]
WHERE [type] = N'S' AND [name] = N'IIS APPPOOL\MyWebApi AppPool')
Begin
CREATE USER [IIS APPPOOL\MyWebApi AppPool]
FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
J'utilise SUSER_ID () et USER_ID () pour ce genre de choses:
-- Check SQL Server Login
IF SUSER_ID('SomeLogin') IS NULL
CREATE LOGIN SomeLogin WITH PASSWORD = 'SomePassword';
-- Check database user
IF USER_ID('SomeUser') IS NULL
CREATE USER SomeUser FOR LOGIN SomeLogin;
Un raffinement supplémentaire, car cela rendrait la lecture plus optimale.
USE [MyDatabase]
GO
IF DATABASE_PRINCIPAL_ID('IIS APPPOOL\MyWebApi AppPool') IS NULL
BEGIN
CREATE USER [IIS APPPOOL\MyWebApi AppPool]
FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
END
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
Si vous utilisez des serveurs enregistrés, vous pouvez vérifier plusieurs serveurs à la fois et renvoyer un vrai/faux avec:
SELECT @@servername,
CASE
WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1
ELSE 0
END AS YesNo