SQL 2012在运行即席查询和存储过程时返回不同的结果

时间:2013-11-20 09:27:44

标签: sql sql-server sql-server-2012

这真的很奇怪。 我有以下代码:

SELECT [name] 
FROM sys.databases 
WHERE [name] NOT IN('tempdb') 
  AND [source_database_id] IS NULL 
  AND [state_desc] = 'ONLINE'

当我运行代码时,我得到了5个数据库的列表(没关系):

模型
MSDB
维护
SSISDB

当我创建一个运行相同代码的过程时,我只得到两个:

CREATE PROCEDURE [dbo].[usp_test99]
WITH EXECUTE AS OWNER 
     AS
BEGIN

     SELECT [name] 
     FROM sys.databases 
     WHERE [name] NOT IN('tempdb') 
       AND [source_database_id] IS NULL 
       AND [state_desc] = 'ONLINE'
END

执行维护。[dbo]。[usp_test99]

这就是结果:

维护

我在这里想念什么? 这是SQL 2012.它发生在某些服务器上,而不仅仅发生在一台服务器上。

由于

1 个答案:

答案 0 :(得分:2)

尝试使用WITH EXECUTE AS CALLER,因为存储过程的所有者可能在您的系统上没有适当的权限。

documentation州:

  

如果 sys.databases 的调用者不是数据库的所有者   并且数据库不是 master tempdb ,最小值   查看相应行所需的权限是ALTER ANY   DATABASE或查看任何DATABASE服务器级权限或CREATE   数据库中的DATABASE权限。数据库到哪个   可以始终在 sys.databases 中查看连接的呼叫者。

所以你可以使用

USE [Maintenance]
GRANT VIEW ANY DATABASE TO [dbo]

WITH EXECUTE AS 'sa'