sql-server - tiene - se denegó el permiso execute en el objeto sql
No se puede encontrar el objeto porque no existe o no tiene permisos, error en SQL Server (9)
Tengo una base de datos y tengo un script sql para agregar algunos campos en una tabla llamada "Productos" de la base de datos.
Pero cuando estoy ejecutando este script, recibo el siguiente error:
Cannot find the object "Products" because it does not exist or you do not have permissions
¿Por qué se produjo un error y qué debo hacer para resolverlo?
¿El usuario al que está ejecutando este script incluso ve esa tabla?
select top 1 * from products
¿Obtienes algún resultado para esto?
En caso afirmativo, ¿este usuario tiene permiso para modificar la tabla, es decir, ejecutar scripts DDL como ALTER TABLE
etc.? Por lo general, los usuarios normales no tienen estos permisos elevados.
¿Estás seguro de que estás ejecutando el script contra la base de datos correcta? En el estudio SQL Server Management puede cambiar la base de datos con la que está ejecutando la consulta en un cuadro desplegable en una de las barras de herramientas, o puede comenzar su consulta con esto:
USE SomeDatabase
Compartiendo mi caso, espero que eso ayude.
En mi situación dentro de MY_PROJ.Database->MY_PROJ.Database.sqlproj
tuve que poner esto:
<Build Include="dbo/Tables/MyTableGeneratingScript.sql" />
En mi caso, me estaba ejecutando bajo un usuario diferente al que estaba esperando.
Tenía ''DRIVER={SQL Server};SERVER=...;DATABASE=...;Trusted_Connection=false;User Id=XXX;Password=YYY''
como la cadena de conexión que pasé a pypyodbc.connect()
, pero el la conexión todavía estaba usando las credenciales del usuario de Windows que ejecutó la secuencia de comandos (lo verifiqué usando el Analizador de SQL Server y probando una combinación de uid / contraseña no válida, que no dio como resultado un error esperado).
Decidí no profundizar más en esto, ya que cambiar a esta mejor forma de conexión solucionó el problema:
conn = pypyodbc.connect(driver=''{SQL Server}'', server=''servername'', database=''dbname'', uid=''userName'', pwd=''Password'')
Encontré una razón por la cual esto sucedería. El usuario tenía los permisos apropiados, pero el procedimiento almacenado incluía una declaración TRUNCATE:
TRUNCATE TableName
Como TRUNCATE elimina elementos sin iniciar sesión, (al parecer) necesita permisos elevados para ejecutar un procedimiento almacenado que lo contiene. Cambiamos la declaración a:
ELIMINAR FROM TableName
... y el error desapareció
He intentado copiar una tabla de PROD a DEV, pero aparece un error: "No se puede encontrar el objeto X porque no existe o no tienes permisos".
Sin embargo, la tabla sí existía y yo corría como sa, así que tenía permisos.
El problema fue en realidad con CONTRAINTS. Cambié el nombre de la tabla en DEV para que fuera old_XXX meses atrás. Pero cuando intenté copiar el original de PROD, los nombres de Restricción diferida chocaron.
El mensaje de error fue engañoso
Puede hacer clic con el botón derecho en el procedimiento, seleccionar propiedades y ver qué permisos se otorgan a su ID de inicio de sesión. Luego puede marcar manualmente "Ejecutar" y modificar el permiso para el proceso.
O para script esto sería:
GRANT EXECUTE ON OBJECT::dbo.[PROCNAME]
TO [ServerInstance/user];
GRANT ALTER ON OBJECT::dbo.[PROCNAME]
TO [ServerInstance/user];
También podría ser posible que haya creado los "Productos" en su esquema de inicio de sesión e intente ejecutarlos en un esquema diferente (probablemente dbo)
Pasos para resolver este problema
1) abra el estudio de gestión 2) ubique el objeto en el explorador e identifique el esquema bajo el cual se encuentra su objeto? (es el texto antes del nombre de su objeto). En la imagen debajo está el "dbo" y el nombre de mi objeto es estado de acción
si lo ve como "yourcompanydoamin / yourloginid", debería modificar el permiso en ese esquema específico y no en ningún otro esquema.
puede consultar "Separación de propiedad y esquema de usuario en SQL Server"
También puede ocurrir debido a un error al hacer referencia a una tabla como [dbo.Product]
lugar de [dbo].[Product]
.