以后可以在对象中调用EXECUTE AS OWNER吗?

时间:2018-06-20 23:36:15

标签: sql-server tsql impersonation execute-as

考虑以下代码:

<div class="row">
    <div class="column">
        <!-- container for round face photo -->
        <div id="aboutmecontainer">
            <div id="facephoto">
                <!-- photo -->
                <img src="http://via.placeholder.com/200x200" alt="Face" style="height: 100%; width: 100%; object-fit: contain;" />
            </div>
            <!-- container for text underneath face photo -->
            <div id="aboutmetext"><h3 style="color: #000000;">About Me</h3><p></p><h5 style="color: #000000;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum</h5>
            </div>
        </div>
    </div>
    <div class="column">
        <!-- div for map to right of "about me" section -->
        <div id="map">
            <!-- map picture can be edited in photoshop to add new countries -->
            <img src="http://via.placeholder.com/350x600" alt="Map" style="width: 100%; height: 100%; object-fit: contain;">
        </div>
    </div>
</div>

在每个表上,都有一个安全策略,除与数据库用户绑定的安全策略外,不允许更改表上的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; 列,但该策略将允许对“ sa”用户。

问题是TenantId,我需要通过调用主体获得TenantId,因为TenantId已绑定到数据库用户。我知道一个解决方案:在没有TenantId的情况下,在触发器中调用with execute并将其传递到过程中之后调用具有with execute的过程,但随后必须复制插入的表进入临时表,以便我可以在过程中访问它。

我希望有一个更好的解决方案,在我得到TenantId之后,可以稍后在对象中调用execute as owner。从逻辑上讲是有效的,但问题是;他们实施了吗?您在代码中看到的TenantId不是一个好的解决方案,因为它要求当前登录名能够模拟execute as login = 'sa'登录名。

此触发器的要点是允许用户不要在插入内容上指定sa。 我什至不必在应用程序中提及TenantId,所有内容仅在SQL Server上。

另一种解决方案是,对象的创建者是否可以在安全策略中读取我可以读取的对象信息,并基于该信息允许用户更新TenantId。甚至可能是对对象的权限,但问题是我如何读取哪个对象导致了安全策略的调用?

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案,其中触发器调用了用户禁止的模式中的过程。触发器没有“ with execute”,可以获取TenantId并将该信息转发给过程。在该过程中,我具有“以所有者身份执行”,并且能够更改有关任何租户的记录。另外,我将Inserted表的所需列复制到temp表中,以便过程可以看到它,但看不到解决方法。

更好的解决方案:

round   value   class       creacion
1       15.49   H       2018-01-27 14:03:54
2       7.42    H       2018-01-27 14:04:42
3       1.04    L       2018-01-27 14:39:28
4       2.71    H       2018-01-27 14:39:36
5       1.95    L       2018-01-27 14:39:59
6       4       H       2018-01-27 14:40:17
7       4.4     H       2018-01-27 14:40:45
8       1.52    L       2018-01-27 14:41:14
9       28.69   H       2018-01-27 14:41:28
10      7.44    H       2018-01-27 14:42:25
11      1.1     L       2018-01-27 14:43:02
12      1.1     L       2018-01-27 14:43:12
13      1.41    L       2018-01-27 14:43:21
14      1.04    L       2018-01-27 14:53:10
15      1.66    L       2018-01-27 14:53:19
16      8.44    H       2018-01-27 14:53:34
17      1.55    L       2018-01-27 14:54:13
18      2.39    H       2018-01-27 14:55:29
19      2.9     H       2018-01-27 14:55:50
20      1.66    L       2018-01-27 14:56:13
21      2.7     H       2018-01-27 14:56:29
22      7.53    H       2018-01-27 14:56:51
23      2.04    H       2018-01-27 14:57:28
24      1.97    L       2018-01-27 14:57:47
25      1.35    L       2018-01-27 14:58:05