web-dev-qa-db-fra.com

Désactiver plusieurs connexions en une étape

Existe-t-il un moyen de désactiver plusieurs connexions SQL en fonction d'un ensemble d'utilisateurs dans une table? Par exemple:

ALTER LOGIN (Select userid from tbl_user) DISABLE;
6
MelC

Non, vous ne pouvez pas nourrir une requête à un ALTER LOGIN commande. Mais vous pouvez construire la commande assez facilement à l'aide de SQL dynamique:

DECLARE @sql nvarchar(max) = N'',
        @cmd nvarchar(550) = N'ALTER LOGIN $$$ DISABLE;' 
                           + CHAR(13) + CHAR(10);

SELECT @sql += REPLACE(@cmd, N'$$$', QUOTENAME(userid))
  FROM dbo.tbl_user;

PRINT @sql;
-- EXEC sys.sp_executesql @sql;

Lorsque vous êtes satisfait de la sortie, déconnectez le EXEC.

Notez que si vous avez beaucoup des utilisateurs de cette table, vous ne pourrez pas voir la commande entière à l'aide de PRINT, car il y a des limitations de la longueur de sortie. Voir cette pointe pour la solution de contournement.

En outre, il n'y a pas de manipulation d'erreur ici, vous devriez probablement réellement ajouter TRY/CATCH ou rejoindre à sys.server_principals Pour vous assurer que vous désactivez les connexions qui existent réellement:

SELECT @sql += REPLACE(@cmd, N'$$$', QUOTENAME(p.name))
  FROM dbo.tbl_user AS u
  INNER JOIN master.sys.server_principals AS p
  ON p.name = u.userid;
8
Aaron Bertrand