关于应用程序
此页上的脚本内容仅用于导航目的,不会以任何方式变更该内容。
应用程序具有以下用途、结构和命名惯例。
应用程序的用途
该应用程序适用于公司中的两种用户。
-
典型用户(员工经理)
-
Application administrators (应用程序管理员)
典型用户可以完成以下任务:
-
获取给定部门中的员工
-
获取给定员工的职务历史记录
-
显示给定雇员的一般信息(姓名、部门、职务、经理、薪金等)
-
更改给定员工的薪金
-
更改给定员工的职务
应用程序管理员可以完成以下任务:
-
更改现有职务的 ID、职称或薪金范围
-
添加新作业
-
更改现有部门的 ID、姓名或经理
-
添加新部门
应用程序的结构
应用程序使用以下方案对象和方案。
应用程序的方案对象
应用程序由以下方案对象组成:
-
四个表,用于存储以下数据:
-
作业
-
部门
-
员工
-
员工的职务历史记录
-
-
四个版本视图,其中包含表,使您能够在使用完毕的应用程序时使用基于版本的重新定义 (EBR) 来升级已完成的应用程序
-
两个触发器,用于强制执行业务规则
-
两个序列,用于为新部门和新雇员生成唯一主键
-
两个软件包:
-
employees_pkg,典型用户的应用程序接口 (application program interface,API)
-
admin_pkg,面向应用程序管理员的 API
典型的用户和应用程序管理员只能通过其 API 访问应用程序。因此,它们只能通过调用程序包子程序来更改数据。
-
另请参见:
-
“关于 Oracle Database ”了解有关方案对象的信息
-
Oracle Database Development Guide(了解有关 EBR 的信息)
应用程序的方案
为了安全起见,应用程序使用以下五个方案(或用户),每个方案仅具有所需的权限。
-
app_data 拥有除程序包之外的所有方案对象,并使用示例方案 HR 中的表中的数据加载其表
创建程序包的开发人员从不在此方案中工作。因此,它们不会意外更改或删除应用程序方案对象。
-
app_code 仅拥有程序包 employees_pkg
employees_pkg 的开发人员在此方案中工作。
-
app_admin 仅拥有软件包 admin_pkg
admin_pkg 的开发者在此架构中工作。
-
app_user 是典型的应用程序用户,不拥有任何内容,只能运行 employees_pkg
中间层应用服务器以 app_user 身份连接到连接池中的数据库。如果此方案被 SQL 注入 bug 入侵,那么攻击者只能查看和更改允许其查看和更改的 employees_pkg 子程序。攻击者无法删除表、升级权限、创建或更改方案对象或其他任何内容。
-
应用程序管理员 app_admin_user 不拥有任何内容,只能运行 admin_pkg 和 employees_pkg
此方案的连接池非常小,只有特权用户才能访问它。如果此方案被破坏,则攻击者只能查看和更改 admin_pkg 和 employees_pkg 子程序允许其查看和更改的内容。
假设应用程序没有 app_user 和 app_admin_user,而只有一个方案不拥有任何内容,可以同时执行 employees_pkg 和 admin_pkg。对于典型用户和应用程序管理员,此方案的连接池必须足够大。如果 employees_pkg 中存在 SQL 注入 bug,则利用 bug 可以访问 admin_pkg 的典型用户。
假设应用程序只有一个拥有所有方案对象(包括程序包)的方案,而不是 app_data、app_code 和 app_admin。然后,程序包对表具有所有权限,这既不必要又不符合要求。
例如,假定您有一个审计追踪表 AUDIT_TRAIL。您希望 employees_pkg 的开发者能够向 AUDIT_TRAIL 写入,但不能读取或更改它。您希望 admin_pkg 的开发者能够读取 AUDIT_TRAIL 并对其进行写入,但不能对其进行更改。如果 AUDIT_TRAIL、employees_pkg 和 admin_pkg 属于同一方案,则两个软件包的开发者对 AUDIT_TRAIL 具有所有权限。但是,如果 AUDIT_TRAIL 属于 app_data,employees_pkg 属于 app_code,admin_pkg 属于 app_admin,则可以以 app_data 身份连接到数据库,并执行以下操作:
GRANT INSERT ON AUDIT_TRAIL TO app_code;
GRANT INSERT, SELECT ON AUDIT_TRAIL TO app_admin;
另请参见:
-
“关于 Oracle Database ”了解有关方案的信息
-
“关于示例方案 HR ”了解有关示例方案
HR的信息 -
“建议的安全实践”
应用程序中的命名惯例
应用程序使用这些命名惯例。
| 项 | 名称 |
|---|---|
| 表 | table # |
| table # 的版本化视图 | 表 |
| 在编辑视图表时触发 | table _{a|b} event [_fer] 其中:
|
| table # 中的 PRIMARY KEY 约束条件 | table _pk |
| table #. column 上的 NOT NULL 约束条件 | table_column _not_null(脚注 1) |
| table #. column 上的 UNIQUE 约束条件 | table_column _unique(脚注 1) |
| 对 table #. column 执行 CHECK 约束条件 | table_column _check(脚注 1) |
| table1 #. column 到 table2 #. column 上的 REF 约束条件 | table1_to_ table2 _fk(脚注 1) |
| table1 #. column1 到 table2 #. column2 上的 REF 约束条件 | table1_col1 to table2_col2 _fk(脚注 1)(脚注 2) |
| table # 的序列 | 表序列 |
| 参数名称 | p_ name |
| 本地变量名称 | l_ name |
脚注 1:table 、 table1 和 table2 缩写为 emp(表示雇员)、dept(表示部门)和 job_history(表示职务历史记录)。
脚注 2:col1 和 col2 是列名 column1 和 column2 的缩写。约束条件名称不能超过 30 个字符。