none
Crear usuario en Sql Server 2008 con asp.net ejecutando un procedimiento almacenado

    Question

  • Buenas.

    Tengo un problema.

    Estoy utilizando asp.net con C# y me conecto a Sql Server 2008.

    En un formulario de la pagina que estoy haciendo, creo usuarios en Sql Server 2008 enviando los parametros correspondientes a un procedimiento almacenado en la base de datos.

    El problema es que no me esta funcionando el procedimiento, no logro agregar un usuario a la base de datos, tengo todos los permisos habido y por haber como usuario, tambien utilizo el usuario administrador "sa" que se crea por defecto.

     

    el procedimiento almacenado es mas o menos asi:

    --agrega el inicio de sesión               
            SELECT @LNom_Usuario=name FROM master.dbo.syslogins WHERE name = @Nom_Usuario;
          IF @@Rowcount=0               
            Begin       
              EXEC [base_prueba].[dbo].[sp_addlogin] @Nom_Usuario, @Password , 'base_prueba';
            End
         
            --agrega el usuario en la base de datos               
            EXEC [base_prueba].[dbo].sp_grantdbaccess @Nom_Usuario, @Nom_Usuario;
         

            --Asigna el rol al usuario
            EXEC [base_prueba].[dbo].sp_addrolemember  'Leer_Escribir', @Nom_Usuario;

                                   donde Leer_Escribir es una funcion de base de datos.

    Probe de todas la maneras posibles y no logro hacer que funcione.

     

    Este mismo procedimiento almacenado lo estoy utilizando en una aplicación que corre en Sql Server 2005, y funciona correctamente.

     

    Cualquier ayuda me vendria de diez.

     

    Muchas Gracias.-

     

     

     

     

     

    Thursday, January 19, 2012 11:37 AM

Answers

  • LA re pan con queso...el problema estaba en la Contraseña...tengo un algoritmo bastante sencillo para generar una contraseña para cada usuario y que luego deben cambiar.

     

    Como la contraseña no era lo suficientemente compleja, don SQL SERVER, daba el error y no me generaba el inicio de sesion..

     

    Lo probe desde la aplicacion que estoy haciendo, previo a ejecutarlo desde el mismo server.

     

    Seguire intentando y mañana de seguro o les hago una nueva consulta o les paso en detalle el problema y la solución.

     

    Espero sea lo ultimo.

     

    Me queda por resolver lo de Begin End try.

     

    Seguire buscando.

     

    Muchas gracias y hasta pronto.-

    Thursday, January 19, 2012 3:00 PM

All replies

  • ¿Algún mensaje de error?
    Thursday, January 19, 2012 11:43 AM
  • Hola.

    Aunque pueden ser muchas las razones que impidan que ese código funcione, ¿qué es lo que no te funciona?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    Thursday, January 19, 2012 11:48 AM
  • Lo que deberia hacer es en primer lugar, crear un usuario con sus permisos correspondientes.

     

    Lo que no me funciona es que no ejecuta ninguna sentencia:

     

    por ejemplo esta:

       EXEC [base_prueba].[dbo].[sp_addlogin] @Nom_Usuario, @Password , 'base_prueba';

     

    Al procedimiento almacenado lo probe tanto del mismo servidor Sql asi como desde la aplicación web.

     

    Al crear el procedimiento no me da ningun error..es más, al ejecutarlo desde el Management tanto remoto como desde el mismo server, da como resultado cero: 0.

     

    Luego busco en toda la base de datos, y no se crea ningun usuario. Esto mismo, como dije, me funciona bien en Sql Server 2005.

     

    Alguna idea?

     

    Muchas gracias.-

    Thursday, January 19, 2012 12:34 PM
  • Si ese parametro lo ejecutas desde la consola del managment en el servidor "que no funciona", que sucede? mismo error o anda bien?
    Lic. Andrés M. Aiello | DBA MS SQL - Oracle | http://aiellodba.blogspot.com | @AndresAiello
    Thursday, January 19, 2012 12:35 PM
  • Otra cosa..me olvidaba..luego de estas sentencias hay una simple sentencia de Insert que deberia agredar datos en una tabla..pero ni eso ejecuta...si la ejecuta sin las sentencias Exec anteriores.
    Thursday, January 19, 2012 12:36 PM
  • Recien acabo de probar esta sentencia y tampoco resulto:

     

    CREATE LOGIN ['+@Nom_Usuario+'] WITH PASSWORD = '+@Password+', DEFAULT_DATABASE = "base_prueba";

    Thursday, January 19, 2012 12:54 PM
  • ese procedimiento no crea un usuario de base de datos, sino un login de servidor. Es en los login donde tienes que revisar si se ha creado el que indicas o no; luego deberás crear el usuario de base de datos con sp_adduser o, mejor, con CREATE USER
    Thursday, January 19, 2012 1:16 PM
  • si, tenes razon. Me exprese mal...estoy tratando de crear usuarios..ademas queria agrear los inicios de sesion. Aun así, no me esta funcionando.
    Thursday, January 19, 2012 1:19 PM
  • ¿Puedes pasar el código completo de ese procedimiento, así como un ejemplo de llamada para que podamos nosotros comprobar si tienes algo mal?

    Cuando dices que te devuelve cero, supongo que te refieres al valor de retorno de la ejecución de ese procedimiento; si es eso, es que es lo que debe devolver cuando se ha ejecutado correctamente. No te va a dar un mensaje indicando que el login se ha creado correctamente, eso lo compruebas bien con ese valor de retorno, bien comprobando que dicho inicio de sesión existe.

    Thursday, January 19, 2012 1:29 PM
  • Procedimiento Almacenado en Sql Server 2008 R2

     

    USE [base_prueba]
    GO
    /****** Object:  StoredProcedure [dbo].[A_Inicio_Sesion]    Script Date: 01/19/2012 10:34:40 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:       
    -- Create date:
    -- Description:   
    -- =============================================
    ALTER PROCEDURE [dbo].[A_Inicio_Sesion]
            @Nom_Usuario nchar(15),
            @Nom_Real    nvarchar(35),
            @Password sysname,
            @dato1 int,
            @dato2 nvarchar(10),
            @dato3 nvarchar(15)       
    AS
    BEGIN
       
        SET NOCOUNT ON;
       
        Declare @ldato1 int
        Declare @lId_Usuario int
        Declare @nro_Usuario int
        Declare @LNom_Usuario nchar(15)
       
            --busca el Id del usuario y su Dependencia--
      Select @ldato1=Usuario.dato1, @lId_Usuario=Usuario.id_usuario  From Usuario Where nom_usuario=dbo.Usuario.nom_usuario;
     
         BEGIN TRY
       
            --agrega el inicio de sesión               
            SELECT @LNom_Usuario=name FROM master.dbo.syslogins WHERE name = @Nom_Usuario;
          IF @@Rowcount=0               
            Begin       
             EXEC [base_prueba].[dbo].[sp_addlogin] @Nom_Usuario, @Password , 'base_prueba';
     
                                   
            End
         
            --agrega el usuario en la base de datos               
            EXEC [base_prueba].[dbo].sp_grantdbaccess @Nom_Usuario, @Nom_Usuario;


            --Asigna el rol al usuario
            EXEC [base_prueba].[dbo].sp_addrolemember 'Leer_Escribir', @Nom_Usuario;

           
            Select top 1 @nro_Usuario=Usuario.id_usuario + 1 From Usuario Order by Usuario.id_usuario desc;

             Insert Into Usuario
                (    nom_usuario,
                    nom_real,                
                    dato1,
                    global,
                    id_creador,
                    dato2,
                    dato3
                )
                values  
                (   
                    @Nom_Usuario,                
                    @Nom_Real,
                    @dato1,
                    '0',
                    @lId_Usuario,
                    @dato2,
                    @dato3
                )
           
            --Select 'Autorizado'=1;
            Select 'Autorizado'=@nro_Usuario;
        END TRY   

        BEGIN CATCH
            Select 'Autorizado'=0;
       END CATCH;

     
    END

    Thursday, January 19, 2012 1:40 PM
  • Habra alguna diferencia entre Sql Server 2005 y 2008 en cuanto a persmisos o algo que no me deje ejecutar este procedimiento en el 2008 pero si en el 2005?
    Thursday, January 19, 2012 1:56 PM
  • Hola.

    Te aconsejo que, con fines de depuración, saques el try catch o bien muestres o captures el error de alguna manera. Te está devolviendo errores, pero al capturarlos, no sabes qué es ni qué hacer para solucionarlos.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    Thursday, January 19, 2012 2:06 PM
  • Si fuera eso, te lanzaría un mensaje de error y no parece ser el caso.

    No parece tener sentido lo que te ocurre: dices que lanzas el procedimiento de crear el login (sp_addlogin), que te devuelve 0 (lo cual es correcto) pero que no te crea el usuario. ¿Eso es así?

    No sé, prueba a lanzar el SQL Profiler para ver si tienes ahí más información...

    Thursday, January 19, 2012 2:11 PM
  • Le saque el Begin try end try---y funciono...me dio otro error pero en la ultima parte en donde agrego datos:

    Select top 1 @nro_Usuario=Usuario.id_usuario + 1 From Usuario Order by Usuario.id_usuario desc;

             Insert Into Usuario
                (    nom_usuario,
                    nom_real,                
                    dato1,
                    global,
                    id_creador,
                    dato2,
                    dato3
                )
                values  
                (   
                    @Nom_Usuario,                
                    @Nom_Real,
                    @dato1,
                    '0',
                    @lId_Usuario,
                    @dato2,
                    @dato3
                )

     

    Ahora..necesito saber si el procedimiento genero o no el inicio de sesion correctamente...Por eso el Bein try End try y Catch.

     

    No entiendo porque no funciona con el begin...aluna idea?

     

    Thursday, January 19, 2012 2:45 PM
  • LA re pan con queso...el problema estaba en la Contraseña...tengo un algoritmo bastante sencillo para generar una contraseña para cada usuario y que luego deben cambiar.

     

    Como la contraseña no era lo suficientemente compleja, don SQL SERVER, daba el error y no me generaba el inicio de sesion..

     

    Lo probe desde la aplicacion que estoy haciendo, previo a ejecutarlo desde el mismo server.

     

    Seguire intentando y mañana de seguro o les hago una nueva consulta o les paso en detalle el problema y la solución.

     

    Espero sea lo ultimo.

     

    Me queda por resolver lo de Begin End try.

     

    Seguire buscando.

     

    Muchas gracias y hasta pronto.-

    Thursday, January 19, 2012 3:00 PM
  • Listo. Comprobe el Procedimiento Almacenado.


    El unico problema que tenia era la complejidad de la Contraseña.

     

    Sql Server 2008 no me permitia una contraseña simple.

     

    Pero creo lo que mas me costo es poder obtener el error que tira el procedimiento cuando lo ejecutaba desde el server. Porque solo cuando vi el mensaje de error, pude darme cuenta de que era lo que tenia mal.

     

    Muchas gracias por todo.

     

    Saludos.-

    Thursday, January 19, 2012 3:16 PM
  • Hola.

    Para dar el hilo por cerrado, marca la respuesta o respuestas que ayudaron a solucionar el error.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    Thursday, January 19, 2012 3:23 PM