考虑这段代码:
ALTER TRIGGER [dbo].[AfterInsertUpdateTenant_Korisnici]
ON [dbo].[Korisnici]
WITH EXECUTE AS OWNER
FOR INSERT
AS
DECLARE @TenantId INT = dbo.GetCurrentTenantId();
EXECUTE AS LOGIN = 'sa';
UPDATE Korisnici
SET TenantId = @TenantId
FROM Inserted i
WHERE Korisnici.Id = i.Id;
REVERT;
在每个表上,都有一个安全策略不允许更改TenantId
表上除绑定到数据库用户的列之外的列,但该策略将允许“sa”用户进行更改。
问题是TenantId
,我需要TenantId
与调用主体一起获取,因为TenantId
绑定到数据库用户。我知道一个解决方案:没有with execute
触发器并调用一个过程,with execute
在我获取TenantId
并将其传递给过程之后,我必须将表插入到临时表中,以便我可以在过程中访问它。
我想要一个更好的解决方案execute as owner
,在我得到TenantId
. 从逻辑上讲它是有效的,但问题是;他们实施了吗?execute as login = 'sa'
您可以在代码中看到这不是一个好的解决方案,因为它要求当前登录能够模拟sa
登录。
此触发器的要点是允许用户不指定TenantId
插入。我什至不必TenantId
在应用程序中提及,一切都只在 SQL Server 上。
另一种解决方案是,如果对象的创建者可以在对象上写入一些我可以在安全策略中读取的信息,并基于该信息允许用户更新TenantId
. 它甚至可能是对象的权限,但问题是我如何才能读取导致调用安全策略的对象?