none
Error: Cannot execute as the database principal because the principal "dbo" does not exist RRS feed

  • Pregunta

  • Hola buen día foro,

    Tengo un problema que es el siguiente:

    Estoy realizando unas pruebas donde necesito un usuario que pueda manejar o administrar otorgando permisos solo a nivel objeto.

    Primero he creado mi usuario  y mi login 

    USE myDatabase
    GO
    CREATE LOGIN UserQA WITH PASSWORD = 'Prueb@123', DEFAULT_DATABASE = [myDatabase]; 
    GO
    CREATE USER UserQA FOR LOGIN UserQA ;  
    GO

    En sus propiedades en la pestaña -> server Role, solo he dejado por defecto el role "public" y securables no tiene nada así como los permisos tambien quedan en blanco

    Después he creado un sp que crea una tabla,

    CREATE PROCEDURE [dbo].[sp_creaTablaPrueba]
            @tabName        nvarchar(30)
            AS
            BEGIN
                   
    		DECLARE @SQLString NVARCHAR(MAX)
    			Set @SQLString = 'CREATE TABLE ' +@tabName+
    			'(
    			[ID] [int] IDENTITY(1,1) NOT NULL,
    			[Campo1] [int] NOT NULL
    		) ON [PRIMARY]'
    
    EXEC (@SQLString)
    END

    Ejecuto este sp con el usuario UserQA y no he logrado que funcione, intente con los Grant execute, grant create sobre el sp y de igual forma no he logrado resultados.

    La única forma es utilizando el Grant Alter pero da permisos de Crear y eliminar tablas, lo cual no me sirve.

    Después cree un role y lo sigue a mi usuario.

    CREATE ROLE RoleQA AUTHORIZATION dbo;
    EXEC sp_addrolemember 'RoleQA', 'UserQA';

    Intente ejecutar el SP pero ahora me aparece un error diferente:

    Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.

    Si pudieran ayudarme por favor, se los agradecería mucho.

    Saludos

    martes, 23 de mayo de 2017 16:39

Respuestas

Todas las respuestas

  • Hola:

    Has probado algo como:

    CREATE PROCEDURE [dbo].[sp_creaTablaPrueba]
    @tabName nvarchar(30)
    EXECUTE AS UserQA
    AS
    BEGIN
      DECLARE @SQLString NVARCHAR(MAX)
      Set @SQLString = 'CREATE TABLE ' + @tabName + '([ID] [int]
      IDENTITY(1,1) NOT NULL,[Campo1] [int] NOT NULL) 
      ON [PRIMARY]';
    
      EXEC sp_executesql @SQLString;
    
    END;

    Saludes cordiales.


    Camilo Villa

    martes, 23 de mayo de 2017 18:31
  • Hola @Camilo A. Villa,

    Primeramente gracias por la respuesta, no intente la forma que me comentas, he intentado utilizar el codigo que me muestras pero me muestra el siguiente error,

    The EXECUTE permission was denied on the object 'sp_creaTablaPrueba', database 'ProtInvDB', schema 'dbo'.


    Saludos


    • Editado Rafiñña martes, 23 de mayo de 2017 20:59
    martes, 23 de mayo de 2017 20:52
  • Hola @Rafiñña:

    Deberías revisar los premisos, te dejo este link de referencia, el cual contiene una solución posible.

    Atte.


    Camilo Villa

    miércoles, 24 de mayo de 2017 17:18