跨不同数据库执行存储过程

问题描述 投票:0回答:1

我有一个临时数据库 [StageDB] 和一个生产数据库 [ProdDB],其中数据最初从 API 导入到 [StageDB],然后将数据插入或更新到 ProdDB。

我有一个名为 [User1] 的实例的 Windows 身份验证登录,该实例有一个 Public 服务器角色和用户映射到 [StageDB] 和 [ProdDB],但没有成员身份。

[ProdDB] 上有一个名为 proc_update_documents 的存储过程。

ALTER PROCEDURE [dbo].[proc_update_documents]
AS

UPDATE [ProdDB].[dbo].[tbl_documents]
    SET
        [last_name] = D.[last_name],
        [first_name] = D.[first_name],
        [category] = D.[category]
FROM
        [StageDB].[dbo].[tbl_documents] D
WHERE
        D.[document_id] = [ProdDB].[dbo].[tbl_documents].[document_id];

INSERT INTO [ProdDB].[dbo].[tbl_documents]
(
    [document_id],
    [last_name],
    [first_name],
    [category]
)

SELECT
    [document_id],
    [last_name],
    [first_name],
    [category]
FROM
    [StageDB].[dbo].[tbl_documents] D
WHERE
    NOT EXISTS(SELECT [document_id] FROM [ProdDB].[dbo].[tbl_documents] X WHERE D.[document_id] = X.[document_id])

然后我在 [StageDB] 中有一个名为 proc_ProdDB_update_documents 的存储过程

ALTER PROCEDURE [dbo].[proc_ProdDB_update_documents]
AS

EXEC [ProdDB].[dbo].[proc_update_documents]

User1 已被授予对两个存储过程的 EXECUTE 权限

USE [ProdDB]
GO
GRANT EXEC ON [dbo].[proc_update_documents] TO [User1];
GO

USE [StageDB]
GO
GRANT EXEC ON [dbo].[proc_ProdDB_update_documents] TO [User1];
GO

但是,当我从 StageDB 执行存储过程 proc_ProdDB_update_documents 时,尽管 User1 对存储过程具有 EXECUTE 权限,但我收到 SELECT 权限错误。

USE [StageDB]
Go

EXEC [dbo].[proc_ProdDB_update_documents]

消息 229,级别 14,状态 5,程序 ProdDB.dbo.proc_update_documents,第 4 行 [批量开始第 2 行] 数据库对象“tbl_documents”的 SELECT 权限被拒绝 “StageDB”,架构“dbo”。

消息 229,级别 14,状态 5,程序 ProdDB.dbo.proc_update_documents,第 23 行 [批量开始第 2 行] 数据库对象“tbl_documents”的 SELECT 权限被拒绝 “StageDB”,架构“dbo”。

完成时间:2024-05-01T15:30:14.6407168+01:00

我不希望用户User1对基础表有SELECT权限,而只对存储过程有EXECUTE权限。如果我授予 User1 对 StageDB.tbl_Documents 的 SELECT 权限,那么存储过程可以正常工作,但我希望不要这样做...

sql sql-server sql-server-2019
1个回答
0
投票

如果我理解执行

proc_update_documents
意味着什么,似乎
User1
需要
SELECT
上的
[StageDB].[dbo].[tbl_documents]
权限和
UPDATE
上的
[ProdDB].[dbo].[tbl_documents]
权限。

我不确定如果 SP 是由

User1
执行的,你如何解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.