我正在使用SQL Server 2014。
我已将存储过程的EXECUTE授予用户帐户,但是当sp运行时,我得到结果和错误。这是来自SSMS,选择了“结果到文本”:
set nocount on
use trx_d
go
select specific_name
from information_schema.routines
where routine_type = 'PROCEDURE'
and specific_name = 'proc_plan_get_count';
go
exec dbo.proc_plan_get_count 225, 2016;
go
specific_name
----------------------------------
proc_plan_get_count
status_code status_count
-------------------- ------------
Approved 1
Msg 15151, Level 16, State 1, Procedure proc_plan_get_count, Line 25
Cannot find the object 'proc_plan_get_count', because it does not exist or you do not have permission.
我尝试删除并重新创建sp(它只包含一个带有WHERE子句的SELECT语句,该子句反映了传入的参数)。我认为这可能会清除蜘蛛网,因为当我尝试创建一个新的简单程序时,我没有任何问题。下降& create无效,上面出现的行为相同。
我更改了sp的内容以避免任何表引用,运行它并且我没有收到任何错误。放回SELECT stmt导致问题重新浮出水面。但是,此用户帐户位于db_datareader角色中(您可以在上面的输出中看到它已成功读取该表)。
然后我尝试用新名称重新创建程序(最后我添加了一个“2”),运行时我没有收到任何错误。
我非常困惑,感谢任何有关解决问题的帮助,
- =查
答案 0 :(得分:1)
成为SQL Server的新手,这个让我有点意外。当我请求通过SSMS修改代码时,这是代码的要点:
USE [trx_d]
GO
/****** Object: StoredProcedure [dbo].[proc_plan_get_count] Script Date: 1/25/2016 12:36:49 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[proc_plan_get_count]
-- Add the parameters for the stored procedure here
@EmployeeId int = 0,
@PlanYear int = 0
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT stdcode as status_code, COUNT(*) as status_count
FROM **********
WHERE yr = @PlanYear AND
empnum = @EmployeeId
GROUP BY stdcode
END
GRANT EXEC ON [dbo].proc_plan_get_count TO *****
因此,由于在END关键字之后没有GO,因此GRANT stmt实际上是源代码的一部分,并且是sp执行时的错误源。
我们为什么现在点击它?我们正在切换到新的数据库登录,虽然新登录看起来具有与旧登录相同的所有权限,但旧登录必须有一些其他权限,它们不会在GRANT EXEC步骤中做出反应。它会抛出警告而不是错误:
status_code status_count
-------------------- ------------
Approved 3
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.