代码之家  ›  专栏  ›  技术社区  ›  geoCode

如何在不授予其ALTER权限的情况下从数据库前端执行包含ALTER语句的SQL Server存储过程?

  •  0
  • geoCode  · 技术社区  · 10 月前

    数据库设置: 我正在使用连接到SQL Server后端的MS Access前端。出于安全目的,前端(用户)使用的对象(视图和存储过程)= MyDbsFront -名称已更改)具有不同的架构( 方案2 )然后是数据库所有者的( 方案1 )其容纳数据表。数据访问被选择性地提供给 MyDbsFront 通过视图或存储过程(通过所有权链)。

    其中一张桌子( 方案1.MyTable )具有一个触发器集,用于更新 已更新 已更新dByUserId 当一行中的值发生变化时,列。我将此功能放在后端,因为我有时会手动上传数据(通过Contoso),我想确保这些列得到正确更新,而不管表是以何种方式更新的。前端无法直接编辑这两列。

    自动填充程序: 最近,我创建了一个存储过程( schema1.自动更新 )这会自动填充一些列。当使用该过程修改行时,我想在 已更新dByUserId 列。为了防止更新触发器还原此更改,我包含了一个ALTER语句来临时禁用触发器,然后在更改后重新启用它。

    问题: 从后端执行时,该程序运行良好。但是,当我尝试从前端执行触发器时,我遇到了权限错误( “找不到对象,因为它不存在或没有权限…” ). 我已将问题缩小到与ALTER语句相关的权限问题,如果我授予ALTER权限 MyDbsFront 用户打开 方案1.MyTable 一切正常。但是,我不希望无限期地向前端授予ALTER权限,因为这会带来安全隐患。

    问题: 有没有一种方法可以在不授予其ALTER权限的情况下从数据库前端执行包含ALTER语句的存储过程?

    我尝试使用过程中的代码临时授予更改权限和撤销权限,但失败了,因为您无法向数据库所有者或您自己授予权限。

    1 回复  |  直到 10 月前
        1
  •  1
  •   David Browne - Microsoft    10 月前

    将存储过程配置为“以所有者身份执行”。默认设置为“EXECUTE AS CALLER”,调用者没有禁用触发器的权限。

    create or alter procedure usp_foo
    with execute as owner
    as
    begin
      set xact_abort on;
      begin transaction;
      disable trigger tg_tt on tt;
    
      insert into TT(UpdatedBy) values ('Auto');
    
      enable trigger tg_tt on tt;
      commit transaction;
    end