2009-09-10 28 views
8

¿Hay alguna manera de reparar a un usuario huérfano en una base de datos SQL 2005/2008 utilizando SQL SMO?¿Cómo reparar usuarios huérfanos con SQL SMO?

Usted puede encontrar usuarios huérfanos con relativa facilidad mediante la enumeración a través de los usuarios y en busca de una propiedad vacía User.Login:

using Microsoft.SqlServer.Management.Smo; 
using Microsoft.SqlServer.Management.Common;  
public static IList<string> GetOrphanedUsers(Server smoServer, string database) { 
     Database db = smoServer.Databases[database]; 

     List<string> orphanedUsers = new List<string>(); 
     foreach (User user in db.Users) { 
      if (!user.IsSystemObject && user.Login == string.Empty) { 
      orphanedUsers.Add(user.Name); 
      } 
     } 

     return orphanedUsers; 
    } 

Desafortunadamente, la solución no es tan simple como establecer la propiedad User.Login al inicio de sesión de servidor coincidente nombre. User.Login tiene un colocador, pero no conozco una forma de propocionar eso de regreso al servidor. Parece solo utilizable cuando está creando un nuevo User.

Consideré descartar al usuario de la base de datos y volver a vincular el inicio de sesión del servidor a la base de datos, pero eso conlleva complicaciones adicionales. Complicaciones como la reasignación de esquemas predeterminados, roles y si poseen un esquema en la base de datos que te proporcionará más problemas a medida que realices esos cambios. Es suficiente para hacer que usted desea inline del SQL y hacerse con él:

ServerConnection server = new ServerConnection("MyBox\SQLInstance"); 
Database db = server.Databases["MyDatabase"]; 
db.ExecuteNonQuery("sp_change_users_login 'auto_fix', 'ORPHANED_USERNAME'") 

Sin embargo, preferiría no coloca en línea una llamada a un procedimiento almacenado del sistema.

¿Alguna sugerencia?

Respuesta

5

Desafortunadamente SMO no es mucho mejor que SQL-DMO para proporcionar los métodos que debería estar disponible. Vas a tener que utilizar SQL en línea:

db.ExecuteNonQuery("sp_change_users_login 'auto_fix', 'ORPHANED_USERNAME'") 

o

db.ExecuteNonQuery("sp_change_users_login 'update_one', 'ORPHANED_USERNAME', 'ORPHANED_USERNAME'") 
+0

Esto es más o menos lo que estaba concluyendo a partir de la respuesta de Gbn, y los comentarios hasta el momento. Esto parece una respuesta-robo, pero, por lo que puedo decir, es la respuesta correcta. – Yoopergeek

+0

Sólo una cara a cara, la documentación de MSDN, http://msdn.microsoft.com/en-us/library/ms174378.aspx, indica que este método se eliminará en las versiones futuras de SQL Server y para el usuario Alter User, que como Yoopergeek fijado a continuación no funciona con SMO. – Despertar

2

de T-SQL ALTER LOGIN ... WITH LOGIN = ...

login = login_name

Re-mapea al usuario otro inicio de sesión mediante el cambio del usuario identificador de seguridad (SID) para que coincida con el SID del de inicio de sesión.

Ahora, yo no lo he probado porque me sincronizar SID a través de servidores (y rara vez utilizar SQL Entradas en estos días)

Sin embargo, esto se correlaciona con el User.Alter Method.

Por lo tanto, podría funcionar ...

Si no le gusta usar el mismo nombre de usuario, calculo que podría asignar a otro usuario y la parte posterior.

+1

Excelente sugerencia. No estoy seguro de cómo me perdí el método User.Alter(). Sin embargo, parece configurar el User.Login, y luego llamar User.Alter() no está permitido. Lanza una FailedOperationException que indica: "Alter failed for User 'MyOrphanedUser'." FailedOperationException tiene una excepción interna de tipo SmoException que establece: "No se permite modificar la propiedad de inicio de sesión del objeto User.Debe soltar y volver a crear el objeto con la propiedad deseada. "Tal vez simplemente no es posible huérfano a través de la API de SMO? – Yoopergeek

+0

Lo siento," No lo he intentado " – gbn

+5

simplemente haga Smo.Database.ExecuteNonQuery (" Alter User FOO Con Login FooLogin "). – RBarryYoung

Cuestiones relacionadas