gpt4 book ai didi

sql-server - 触发器运行时 dbo 用户抛出 "Server principal is not able to access the database"

转载 作者:行者123 更新时间:2023-12-04 00:09:39 25 4
gpt4 key购买 nike

在一个数据库上以所有者身份运行的触发器在运行时无法插入到另一个数据库,即使用户是两个数据库的 dbo。

错误:服务器主体“AUser”无法在当前安全上下文下访问数据库“DatabaseB”。

示例触发器:

CREATE TRIGGER "MyTrigger"
ON "DatabaseA".dbo.MyTable
WITH EXECUTE AS OWNER
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO DatabaseB.dbo."MyOtherTable" (ColumnA) VALUES ('test');
END
GO

"AUser"是 DatabaseA 和 DatabaseB 的 DBO,现在更新 "DatabaseA".dbo.MyTable 中的记录会导致服务器主体错误

编辑:在 DatabaseA 上启用 TRUSTWORTHY 解决了这个问题,但我宁愿不这样做

最佳答案

这是因为您使用了“WITH EXECUTE AS OWNER”子句。
当您的 DML 触发器/存储过程使用“WITH EXECUTE AS”时,要模拟的主体是 用户 , 不用登录,这里可以看清楚:
EXECUTE AS Clause (Transact-SQL)
enter image description here

' user_name '

Specifies the statements inside the module execute inthe context of the user specified in user_name. Permissions for anyobjects within the module are verified against user_name. user_namecannot be specified for DDL triggers with server scope or logontriggers. Use login_name instead.


因此,使用 execute as user 子句,您已经在数据库中对执行进行了沙盒处理。
当您不使用此子句时,过程/触发器由登录执行,因此如果登录能够访问另一个数据库,它将起作用。但是通过作为 执行用户 您不再使用登录名,因此即使所有者是 sa 你仍然会得到同样的错误:

The server principal "sa" is not able to access the database"DatabaseB" under the current security context.


解决此问题的不安全方法是让您的 databaseA TRUSTWORTHY + 它的所有者应该有 AUTHENTICATE SERVER允许。
如果您没有 db_owners,可以使用此方法的 databaseA不是 sysadmins ,否则他们可以将他们的权限提升到 sysadmin .
其他方式更复杂,但 安全 e:使用 certificates .

关于sql-server - 触发器运行时 dbo 用户抛出 "Server principal is not able to access the database",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48185454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com