
简介从权限字段维护、权限对象创建到角色授权与程序校验SAP权限维护专题文档面向SAP系统管理员、ABAP开发顾问及权限运维人员内容系统且贴近实践。全篇围绕SU20、SU21、PFCG等核心事务代码展开SU20中维护权限字段、选择数据元素并设定取值范围SU21中选用合适对象类、自定义权限对象及授权字段PFCG中创建角色、分配菜单权限、挂接用户并执行用户比较使权限配置真正落地。文档同时给出AUTHORITY-CHECK OBJECT语句在ABAP程序中的用法说明如何结合sy-subrc完成权限判断并补充通过S_GUI权限对象限制ALV报表导出的设置帮助保护敏感数据。压缩包内仅1个doc文件约348KB携带方便已有1539人学习下载适合需要快速掌握SAP权限体系或作为内部培训参考的SAP从业者。1. SAP维护权限对象为什么这份文档值得从“出问题”开始读“SAP维护权限对象”这六个字拆开看是三个动作维护、权限对象、文档化。真正做过权限实施的都清楚系统里最容易被忽略、也最容易引发生产事故的恰恰就是这组配置。用户报“权限不足”BASIS查SU53最后定位到某个维护类权限对象缺失或字段值配错前后不到十分钟真正难的是这类对象散落在业务顾问的说明文档里、开发者的注释里和系统里的实际状态根本对不上。这份文档要解决的就是把“维护权限对象”这件事从黑匣子变成可维护、可交接、可复现的操作记录。适合谁读SAP权限顾问、BASIS运维、经常处理授权问题的ABAP开发以及需要在项目交付时整理权限模块文档的人。读完你能回答三件事对象在哪维护、怎么挂进角色并生效、出问题时怎么查。2. 权限对象的底层逻辑从SU21定义到SU24默认挂载2.1 权限对象的四个构成部分权限对象是SAP授权检查的最小单元比角色更底层。一个角色可以挂几十个对象系统在执行程序时按“对象”逐个检查任何一个对象的检查没通过功能都会报权限不足。维护类权限对象指的是那些服务于“新增、修改、删除、显示”这类维护动作的对象典型场景就是自定义表的维护功能——对象建没建、字段值给没给直接决定用户能不能在界面上保存数据。一个权限对象由四部分构成缺一不可。构成说明示例对象类用于分组归类决定在SUIM等工具里的收纳位置“AA”资产、“XX”自定义开发对象名对象的唯一标识自定义对象一般用Y/Z开头Y_MAT_MAINT权限字段对象内部携带的检查字段至少包含一个ACTVT、MATNR、WERKS活动值ACTVT字段允许的动作值01新增、02修改、03显示、06删除维护类权限对象为什么容易出问题关键在于“划分口径”。比如一张自定义物料表ZMMT001业务上要求“采购员只许改自己负责工厂的数据仓管员只能看”。如果权限对象里只放了ACTVT没有放工厂字段那么授权粒度就只能到“能不能维护整个表”工厂维度的隔离做不到。反过来字段放多了角色维护时每个字段都要填值漏一个用户就操作不了。我一般建议字段数量控制在3个以内除了ACTVT最多再放一两个真正需要按数据维度区分的字段如表名、工厂、公司代码不要什么都往里塞。2.2 SU21里创建和维护对象的操作要点SU21是权限对象的“定义端”。所有自定义权限对象的创建工作都在这里完成。常见做法是给每张需要维护功能的自定义表建一个独立对象而不是复用标准对象。操作路径如下事务码进入SU21在“对象”树里找到自定义对象类右键选择创建输入对象名、对象文本选择对象类进入字段维护页签添加权限字段勾选允许的活动值保存并生成权限参数文件的默认值新建对象后至少做一次“保存并生成字段名”动作确认对象出现在权限树里。参数说明对象名务必使用Y或Z开头这样系统升级时自定义对象不会和标准对象冲突对象文本要写清楚“哪张表、什么用途”因为几个月后连你自己都会忘记这个对象是干什么的活动值选取时03显示是底线业务需要维护时再加01、02、06但允许的值不要全勾——一旦勾了你自定义对象的可直接授权上限就定死了。这里给一个非常容易翻车的细节SU21里创建对象时如果直接选了“复制对象”的方式来创建复制的字段列表里往往会带进来原对象多余的活动值或字段。我有一个血泪经验某次复制标准对象创建自定义对象没有清掉字段列表里的三个组织级别字段导致后面每个角色上都多了一组必填字段业务顾问维护角色时天天报错查了两天才发现是复制残留。所以复制完成后一定把字段列表和活动值逐项过一遍再保存。2.3 SU24把权限对象挂到事务码的默认配置SU24负责在事务码和权限对象之间建立“默认关联”。PFCG生成角色的权限数据时会根据角色菜单里的事务码自动把SU24里配置好的对象带出来不需要手工逐个添加。对自定义维护程序来说这一步是必须做的——不然每次创建角色都要手工加对象漏加一个用户直接没法用。配置路径SU24进入后输入事务代码界面会列出该事务码对应的所有权限对象对自定义事务码先执行“复制默认值到客户自定义层”在客户自定义层里维护对象清单把Y/Z自定义对象加入保留必需的标准对象如S_TCODE用于事务码检查、S_PROGRAM用于ABAP程序授权把不相关的标准对象标记为“不检查”或删除关联避免生成角色时带入一堆用不上的默认对象。系统里和SU24相关的还有SU22与SU25。SU22用来查询“某个权限对象被哪些事务码引用”排查“这个对象改了影响多大”时非常有用SU25是权限参数文件的初始配置工具首次实施时跑一次把标准对象配置导入到客户自定义层。三者的分工是SU21定义对象SU24维护对象与事务码的关联SU22反向查引用SU25做初始批量装载。注意修改SU24的默认配置只影响之后通过PFCG“自动生成权限”的角色。已经存在的角色不会自动同步必须在PFCG里重新执行“调整权限数据”或手工补对象这就是“维护权限对象”这个说法里最容易产生歧义的地方对象定义改了不代表线上角色跟着改了。3. 把权限对象真正落进角色PFCG维护、参数文件生成与验证3.1 在权限页维护对象字段值的两种路径PFCG是权限对象的“生效端”。角色维护界面的“权限”页签里所有对象的字段值在这里逐项填写。维护类对象在这里的典型落法是把“表名”字段填成具体的表名ACTVT按业务需要勾选动作值组织级别字段填入允许的工厂或公司代码范围。路径一菜单驱动。在“菜单”页签里选好事务码回到“权限”页签点“调整权限数据”系统从SU24默认配置里把对象自动带出来。路径二手工添加。点“权限”页签里的“手工添加对象”按钮输入对象名系统自动带出字段列表逐项填值。两种路径的选择标准自定义维护事务码一定手工添加因为SU24默认配置未必包含你的自定义对象——哪怕配了也要人工核对一遍字段值再生成参数文件。字段值的填写规则是维护权限对象必须讲清楚的细节单个值直接输入如工厂1000写成1000或001000系统保存时自动规范化范围用操作符BT表示区间内全部值CP表示按通配符匹配如“1*”表示所有1开头的值* 表示该字段不限制值含义是“全部”。维护类场景我最常强调不要把整个对象的所有字段都填成 * 。ACTVT要按实际动作勾选表名字段最好显式值。一个只允许维护某张表的角色如果表名字段用了 * 那这个用户将拥有系统里所有挂了这个对象的表维护权限安全审计一查一个准。3.2 生成参数文件改了对象却“没生效”的分水岭PFCG里保存角色只是把权限数据存到数据库表用户侧不会发生任何变化。必须执行“生成参数文件”动作角色的权限数据才会被打包进参数文件并通过用户主数据SU01分配到具体用户。很多“改了角色没生效”的工单追到最后都是少点了一下生成参数文件。标准操作序列PFCG打开角色进入“权限”页签维护或调整对象字段值保存角色点击“生成参数文件”观察日志确认无警告SU01查看用户授权页确认参数文件已经存在于用户下通知用户重新登录或通过权限缓冲刷新机制使变更立即生效。参数文件名称默认继承角色名也可以按角色变式组合生成多个变式参数文件。同一个角色可以生成多组参数文件每组字段值不同分配给不同用户——这种用法在做“同一职能、不同数据范围”的场景非常实用但代价是参数文件变多后权限变更的维护量成倍增长。我建议团队在权限设计阶段就定好“一角色一参数文件”为主、“变式参数文件”为辅的原则节省后面的维护成本。这里还有一个新手常踩的点角色里分配了事务码但事务码本身在SU01里授权范围Tcode授权不足时用户连事务码都进不去会误以为是权限对象的问题。排查顺序一定是事务码能进吗→SU53报什么→再回到对象字段值上不要一上来就翻权限对象。3.3 用一段ABAP快速核查角色里的权限对象PFCG界面逐条查看权限对象效率低遇到几十个角色的批量巡检根本看不完。我一般会在系统里放一个小报表直接用ABAP读取角色权限数据表AGR_1251按角色名输出对象和字段值清单。下面是一段可以跑的自定义报表代码REPORT z_perm_check. PARAMETERS: p_agr TYPE agr_name OBLIGATORY, 角色名 p_obj TYPE xuobject. 权限对象留空表示全部 DATA: gt_out TYPE TABLE OF agr_1251. START-OF-SELECTION. SELECT * FROM agr_1251 INTO TABLE gt_out WHERE agr_name p_agr AND ( p_obj space OR object p_obj ). IF sy-subrc 0. LOOP AT gt_out INTO DATA(gs_out). WRITE: / gs_out-object, | , gs_out-field, | , gs_out-low, | , gs_out-high. ENDLOOP. ELSE. WRITE: / 未找到该角色的权限对象请检查角色名. ENDIF.逻辑说明报表从AGR_1251读取指定角色下挂载的权限对象、字段、授权值LOW-HIGH区间输出为逐行清单。p_agr为必输参数p_obj为空时输出该角色的全部对象如果要核查某个关键对象可以在p_obj里输入对象名做精确筛选。参数说明AGR_1251是角色权限数据的标准存储表存的是PFCG里维护的字段级授权值不是用户最终生效的完整授权因为用户实际拿到的权限还需要结合参数文件生成状态来看。这段代码的用途是做“角色维护状态”的快速巡检比如一个大项目上线前检查所有自定义维护角色是否都挂载了对应的Y/Z对象比在SUIM里导报表快得多。运行报错时先检查角色名是否输错或者对象名是否存在如果输出为空但角色确实有权限多半是权限数据还没生成参数文件用SUIM的角色比对报表确认一下。4. 权限不足怎么排查SU53逆向定位要维护的对象4.1 SU53看缺失权限的标准动作用户报“权限不足”时第一动作是让用户在报错界面停留直接输入事务码SU53。SU53会显示当前会话最近一次权限检查失败的对象、字段、期望值以及用户实际拥有值。注意SU53只记录“最后一次失败的检查”如果一个操作涉及多个权限对象检查失败SU53只会显示最先失败的那个。修完一个让用户重试如果继续报错再看SU53——这时候显示的才是下一个缺失项。SU53界面核心信息有三个缺失对象的名称、缺失字段、期望值。比如用户执行某个报表时报错SU53显示对象Y_MAT_MAINT字段ACTVT期望值02而用户当前的授权值只有03。这个信息直接指向维护方向给该用户所在角色补上ACTVT02。排查的操作路径是固定的用户复现报错随即执行SU53记录对象名、字段、期望值SU01打开用户主数据找到用户挂的角色PFCG打开对应角色定位到该对象检查字段值修正字段值、保存并生成参数文件用户重新登录验证。一个容易忽视的步骤SU53里的对象名记录的是“检查用的对象”如果你在PFCG角色里改的是“参数文件里的对象”要确认两者一致。曾经遇到过角色里挂的是标准对象S_TABLE标准表维护检查而SU53里报的是自定义对象说明该事务码在执行时既检查了标准对象又检查了自定义对象缺哪头补哪头但不能只补一头就收工。4.2 不同类型的失败与处理优先级权限检查失败的性质不同处理策略也不同。把失败类型分清楚能避免大量无效操作。失败类型SU53表现处理优先级对应动作对象整体缺失对象名不在用户的任何授权数据里高PFCG手工添加对象或补事务码后重新生成参数文件活动值缺失对象在ACTVT期望值超出已有值高按业务需求补充活动值字段值不匹配对象在、活动值在但组织级别字段工厂/公司代码值不覆盖中调整字段授权范围按数据范围精确赋值参数文件未生成SU53显示对象和值在角色里都有但用户侧生效数据没有中重新生成参数文件并刷新权限缓冲我习惯的排查顺序是对象有没有→活动值够不够→字段值对不对→参数文件生没生成。这个顺序是从“最可能翻车”到“最少见”排列的。实际工单里字段值不匹配的概率最高——尤其组织级别字段工厂、公司代码、控制范围。很多角色在PFCG里把组织级别字段默认填成 * 看起来省事实际上埋了大雷一旦业务要求按工厂区分数据权限你就得把 * 拆成具体值还要逐角色确认有没有被其他用户借用了同一个角色。所以给维护类角色配组织级别时哪怕业务暂时没提要求也建议按实际业务范围填值不给后续留 * 的隐患。另一个高频误区看到SU53里报“ACTVT缺02”有人在角色里把这个对象的ACTVT直接改成 * 所有活动值全部放开。权限检查确实能过但等于把删除、打印等可能不该开放的动作全放开了。处理原则是“补最少的活动值满足本次需求”不是“放开最大值让报错消失”。5. 维护权限对象的五个常见坑现象、原因、解法5.1 改了角色没生成参数文件用户侧权限不更新现象PFCG里角色权限对象字段值已经改好并保存用户重新登录后仍报同样的权限不足。原因角色保存和数据打包是两个动作。“保存”只写了PFCG的角色数据表“生成参数文件”才把权限数据写入用户授权目录。漏掉生成参数文件用户拿到的永远是旧的参数文件内容。解决返回到PFCG执行“生成参数文件”确认日志无错误后再通知用户重试。如果是批量改动用“批量生成参数文件”的事务码按角色范围一次处理同时提醒用户重新登录以刷新权限缓冲。5.2 复制标准对象创建自定义对象带上多余字段现象新建的Y/Z权限对象在PFCG里挂到角色后出现当初没打算限制的字段业务顾问填写角色权限时被多出来的必填项卡住。原因通过“复制对象”方式创建新对象字段列表和活动值会从源对象带过来。标准对象常含多个组织级别字段复制后没有清理就直接保存了。解决SU21打开对象逐条检查权限字段列表删除不需要的字段如只做表级维护就不需要保留成本中心字段同时清理ACTVT里未使用活动值。改完重新保存到PFCG里刷新该对象的所有引用角色并重新生成参数文件。5.3 活动值只给了03显示保存和修改全部报错现象维护角色时只勾了03显示用户打开界面看数据正常一点“新建”或“保存”就提示权限不足。原因自定义维护类程序的权限检查通常把“显示”和“维护”分开处理。03只放行显示动作02修改、01新增、06删除都没有授权。解决SU53确认缺失的活动值后在PFCG权限页对应该对象的ACTVT字段补勾业务需要的动作值。维护类角色的常见组合030102和0302分别对应录入型与变更型业务不要只图省事勾一个03。5.4 自定义对象在SUIM权限报表里查不到现象SUIM里按对象类展开找不到自己创建的维护对象也没法通过SUIM统计“哪些角色用到了这个对象”。原因创建对象时没有选择对象类或选择了不常用的对象类导致被折叠在错误分组里。SUIM默认按对象类显示对象树对象类为空或非规范命名时对象不会出现在预期位置。解决回到SU21修改对象类维护为自定义开发专用的对象类如“XX自定义”。如果之前已经用不规范对象类分散建了多个对象统一迁移到同一对象类下再做批量角色比对。提交到传输请求时确认对象类包含在传输范围内避免目标系统里对象类丢失导致报表可见性不一致。5.5 文档里写的老对象名和系统实际状态对不上现象按权限文档里的对象名去PFCG里找发现对象名不存在改文档里指定的事务码结果实际系统里事务码对应的对象已是大范围授权版本。原因文档停留在项目上线初期后面开发迭代改了对象名或扩展了对象字段但维护记录没有同步。新接手的人按旧文档操作改完的角色要么权限缺失、要么权限超范围。解决让文档和系统生成关联。常见做法是定期用SU22/SUIM导出“对象-事务码引用清单”和“角色-对象分配清单”覆盖到文档的附录里系统为准、文档为辅。每次SU21有变更立刻更新对应的对象描述和引用角色清单变更记录写清日期、原因、影响角色不接受“改完系统就行、文档后期再补”的习惯。6. 把维护经验沉淀成一份能交接的权限对象文档标题里的.doc不是随手起的。权限维护最怕的不是技术难点而是交接断档人走了经验全在脑子里系统里只有一堆对象名和角色名谁也不敢动。所以最终落点是一份能交接的文档。一份够用的维护权限对象文档至少包含三个部分。第一部分是对象清单对象名、对象文本、对象类、权限字段、可选活动值、状态有效/停用、备注里写清对应表和程序名。第二部分是角色对照哪些角色挂了这个对象每个角色上该对象的字段值是多少组织级别字段是具体值还是 * 最后生成参数文件的时间。第三部分是变更记录每次变更的日期、操作人、变更原因、影响范围、是否已同步角色。这三部分之外再附一张SUIM导出的“对象-事务码引用报表”作为系统快照。更新文档的时机要固化到操作习惯里。我自己的规则是“SU21里动一下文档就动一下”。改对象文本、加字段、停用对象都属于必须同步的变更只改PFCG角色字段值时改动记入角色对照表的变更记录里。这样可以保证三个月后有人问“这个对象为什么多了一个工厂字段”翻文档能直接回答而不是靠回忆。文档和系统的校验手段也很简单季度跑一次SU22反向引用报表把对象清单和引用事务码逐项比对发现文档里没记录的新引用就追查来源再跑一次角色分配报表确认没有“文档标记停用但角色还在用”的对象。整个过程半小时以内却能防住最昂贵的生产事故——权限对象被误改波及十几个角色。我最后想说的是别低估这一页纸的价值。一次版本升级后自定义权限对象被覆盖当时系统里几十个角色的权限数据全部指向了旧对象定义整个团队花了两个晚上逐角色核对。如果当时那份对象清单文档是新的问题半小时就能定位。现在我每次改完对象都先跑一遍报表再更新文档十分钟的维护换来后面几小时不加班这笔账怎么算都值。希望帮到你。本文还有配套的精品资源点击获取