审计列值变动

本文介绍如何使用Oracle的Fine-Grained Auditing (FGA)功能来监控特定表的更改情况,通过添加策略来跟踪对特定列的更新和插入操作,并展示了如何查看审计结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

监控用户test下dept2.dname的改动

SQL> desc dept2;
Name   Type         Nullable Default Comments 
------ ------------ -------- ------- -------- 
DEPTNO NUMBER       Y                         
DNAME  VARCHAR2(14) Y                         
LOC    VARCHAR2(13) Y 

增加add policy

BEGIN
  dbms_fga.add_policy(object_schema   => 'TEST',
                      object_name     => 'dept2',
                      policy_name     => 'update_dept2_dname',
                      audit_column    => 'dname',
                      statement_types => 'update,insert',
                      ENABLE          => TRUE);
END;
/

查看刚增加的policy

SQL> set linesize 500
SQL> col policy_text for a30
SQL> SELECT object_schema, object_name, policy_name, enabled
  2    FROM dba_audit_policies;
OBJECT_SCHEMA                  OBJECT_NAME                    POLICY_NAME                    ENABLED
------------------------------ ------------------------------ ------------------------------ -------
TEST                           DEPT2                          UPDATE_DEPT2_DNAME             YES
1 row selected
Executed in 0.032 seconds

更改dept2

INSERT INTO dept2 SELECT * FROM dept;
UPDATE dept2 SET dname = 'aa';

查看审计结果

SQL> SELECT TIMESTAMP,
  2         sql_text,
  3         policy_name
  4    FROM dba_fga_audit_trail
  5   ORDER BY TIMESTAMP;
TIMESTAMP   SQL_TEXT                                 POLICY_NAME
----------- ---------------------------------------- ------------------------------
2015-03-25  UPDATE dept2 SET dname = 'aa'            UPDATE_DEPT2_DNAME
2015-03-25  INSERT INTO dept2 SELECT * FROM dept     UPDATE_DEPT2_DNAME
2 rows selected
Executed in 0.016 seconds

drop policy

BEGIN
  dbms_fga.drop_policy(object_schema => 'TEST',
                       object_name   => 'dept2',
                       policy_name   => 'update_dept2_dname');
END;

删除审计结果

DELETE FROM sys.fga_log$ WHERE policyname = upper('UPDATE_DEPT2_DNAME');



<think>好的,用户想了解如何使用VBA通过科目余额表生成审计附注。首先,我需要回忆一下审计附注的一般结构和内容。审计附注通常包括各个会计科目的余额变动、明细构成以及相关的会计政策说明。科目余额表则是记录了各科目的期初余额、本期发生额和期末余额的数据表,这是生成附注的基础数据源。 接下来,我需要考虑用户可能使用的工具,这里明确是VBA,所以需要涉及Excel的操作。用户可能已经有一个科目余额表的Excel文件,里面包含各个科目的数据。使用VBA的话,主要是自动化处理这些数据,提取所需的信息,并按照审计附注的格式进行输出。 首先,需要确定科目余额表的结构。通常科目余额表会有科目代码、科目名称、期初余额(借方和贷方)、本期发生额(借方和贷方)、期末余额(借方和贷方)。这些数据需要被正确读取和处理。比如,货币资金可能包括现金、银行存款等子科目,需要汇总这些子科目的数据,并在附注中详细示。 然后,考虑如何用VBA来实现。可能需要编写一个宏,读取科目余额表中的数据,根据预设的逻辑(比如科目代码的范围或名称)进行分类汇总。例如,货币资金可能对应科目代码1001到1009,应收账款对应1122等。对于每个主要科目,需要提取相关子科目的数据,计算合计,并生成对应的附注内容。 接下来,处理数据的方式。可能需要使用数组或字典来存储和处理数据,特别是当需要汇总多个子科目时,字典对象可以帮助快速汇总。例如,创建一个字典,键是主科目名称,是对应的余额或发生额,遍历科目余额表的每一行,将子科目的数累加到对应的主科目中。 然后,生成附注的格式。审计附注通常需要一定的文字描述,结合具体数。例如,“货币资金期末余额为$X$元,较期初增加$Y$元,增幅为$Z\%$。”这些描述需要根据计算出的数动态生成,并确保格式正确,比如货币金额需要千分位分隔符,百分比保留两位小数等。 此外,还需要考虑异常处理,比如科目余额表中可能存在数据错误,或者某些科目没有子科目,这时需要确保代码能够正确处理这些情况,避免运行时错误。例如,使用On Error Resume Next来忽略某些错误,或者添加条件判断检查数据是否存在。 另外,用户可能有特定的附注格式要求,比如需要分段落、使用表格或项目符号。在VBA中生成这些格式可能需要操作Word对象,或者直接在Excel中生成格式化的文本。如果用户需要在Word文档中生成附注,可能需要使用VBA控制Word,创建表格,插入文本等。但通常,可能直接在Excel中生成文本,然后复制到Word中。 测试代码的步骤也很重要。需要确保代码能够正确读取数据,准确分类汇总,生成正确的附注内容。可能需要用示例数据进行测试,验证输出是否符合预期。 最后,考虑代码的维护性和扩展性。比如,将科目分类的规则放在一个可配置的区域,方便用户修改科目代码对应的附注项目,而不必修改代码本身。或者提供注释,说明各部分的功能,方便后续维护。 总结一下,整个流程包括:分析科目余额表结构,设计VBA处理逻辑,读取和汇总数据,生成附注文本,处理格式和异常,测试和优化代码。用户可能需要具体的代码示例,所以准备一个简单的框架,演示如何实现这些步骤,并提示关键点和可能的调整方向。</think>通过VBA从科目余额表生成审计附注需分三步实现,以下是结构化操作指引: --- ### 一、数据准备阶段 1. **科目余额表规范** - 需包含字段:`科目代码`、`科目名称`、`期初余额`、`本期借方`、`本期贷方`、`期末余额` - 示例数据格式: ```plaintext | 科目代码 | 科目名称 | 期初余额 | 本期借方 | 本期贷方 | 期末余额 | |----------|------------|----------|----------|----------|----------| | 1001 | 库存现金 | 50,000 | 200,000 | 180,000 | 70,000 | ``` 2. **审计附注模板设计** - 需包含科目分类注释(如货币资金、应收账款等) - 要求输出格式: ```plaintext 附注三、货币资金 项目 期末余额 期初余额 库存现金 70,000.00 50,000.00 银行存款 2,000,000.00 1,800,000.00 合计 2,070,000.00 1,850,000.00 ``` --- ### 二、VBA实现逻辑 ```vba Sub GenerateAuditNotes() Dim wsSource As Worksheet, wsOutput As Worksheet Dim lastRow As Long, i As Long Dim dict As Object Set dict = CreateObject("Scripting.Dictionary") '1. 设置数据源和输出表 Set wsSource = ThisWorkbook.Sheets("科目余额表") Set wsOutput = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) wsOutput.Name = "审计附注" '2. 提取货币资金类科目(假设科目代码以10开头) lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row For i = 2 To lastRow If Left(wsSource.Cells(i, 1).Value, 2) = "10" Then dict(wsSource.Cells(i, 2).Value) = wsSource.Cells(i, 6).Value '存储科目名称与期末余额 End If Next i '3. 输出到审计附注表 wsOutput.Range("A1") = "附注三、货币资金" wsOutput.Range("A2") = "项目" wsOutput.Range("B2") = "期末余额" wsOutput.Range("C2") = "期初余额" Dim rowIdx As Long: rowIdx = 3 Dim key As Variant, total As Currency For Each key In dict.keys() wsOutput.Cells(rowIdx, 1) = key wsOutput.Cells(rowIdx, 2) = Format(dict(key), "#,##0.00") '期初余额需根据实际业务补充查询逻辑 rowIdx = rowIdx + 1 total = total + dict(key) Next key '4. 添加合计行 wsOutput.Cells(rowIdx, 1) = "合计" wsOutput.Cells(rowIdx, 2) = Format(total, "#,##0.00") End Sub ``` --- ### 三、关键处理要点 1. **科目分类规则** - 使用科目代码前缀识别科目类型,例如: - `10` 开头:货币资金 - `11` 开头:应收账款 - `14` 开头:存货 2. **数据精度控制** - 金额字段需强制保留两位小数 - 使用`Format(数, "#,##0.00")`实现千分位分隔符 3. **扩展性优化** - 可改用数据库查询语句提高大数据量处理效率 - 添加错误处理: ```vba On Error Resume Next '敏感操作代码 On Error GoTo 0 ``` --- ### 四、输出结果示例 ```plaintext 附注三、货币资金 项目 期末余额 期初余额 库存现金 70,000.00 50,000.00 银行存款 2,000,000.00 1,800,000.00 合计 2,070,000.00 1,850,000.00 ``` --- 通过以上步骤可实现基础审计附注生成,实际应用中需根据具体科目分类规则和附注格式要求调整代码。建议通过循环结构扩展其他科目类型的处理模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值