这真的很奇怪。 我有以下代码:
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.它发生在某些服务器上,而不仅仅发生在一台服务器上。
由于
答案 0 :(得分:2)
尝试使用WITH EXECUTE AS CALLER
,因为存储过程的所有者可能在您的系统上没有适当的权限。
如果 sys.databases 的调用者不是数据库的所有者 并且数据库不是 master 或 tempdb ,最小值 查看相应行所需的权限是ALTER ANY DATABASE或查看任何DATABASE服务器级权限或CREATE 主数据库中的DATABASE权限。数据库到哪个 可以始终在 sys.databases 中查看连接的呼叫者。
所以你可以使用
USE [Maintenance]
GRANT VIEW ANY DATABASE TO [dbo]
或
WITH EXECUTE AS 'sa'