Oracle Blockchain Table 详解
Oracle Blockchain Table 详解
适用版本:Oracle Database 21c / 23ai(19c 有限支持) 文档版本:v1.0 / 2026-07
1. 概述
Blockchain Table 是防篡改表[1]:
详细见:Oracle 安全深度解析、Oracle Audit 与 Unified Audit Trail。
2. 特性
2.1 防篡改
- 只能 INSERT
- 不能 UPDATE/DELETE
- 链式
2.2 哈希链
- 行哈希
- 前行哈希
- 链式
2.3 审计
- 用户签名
- 非对称
- 验证
3. 创建
3.1 基本语法
CREATE BLOCKCHAIN TABLE bank_ledger (
bank_id VARCHAR2(128) NOT NULL,
tx_id NUMBER NOT NULL,
amount NUMBER NOT NULL
)
NO DROP UNTIL 31 DAYS AFTER INSERT
NO DELETE UNTIL 16 DAYS AFTER INSERT
HASHING USING "SHA2_512" VERSION "v1";
3.2 参数
- NO DROP:不可删表
- NO DELETE:不可删行
- HASHING:哈希算法
- VERSION:版本
4. 插入
4.1 INSERT
INSERT INTO bank_ledger VALUES ('B001', 1, 100);
INSERT INTO bank_ledger VALUES ('B001', 2, 200);
COMMIT;
4.2 限制
- 只能 INSERT
- 不能 UPDATE
- 不能 DELETE
- 不能 TRUNCATE
5. 验证
5.1 链验证
SELECT * FROM bank_ledger
WHERE ORABC_HASH = ...;
5.2 DBMS_BLOCKCHAIN_TABLE
BEGIN
DBMS_BLOCKCHAIN_TABLE.VERIFY_ROWS(
schema_name => 'SCOTT',
table_name => 'BANK_LEDGER'
);
END;
/
5.3 签名
-- 用户签名
INSERT INTO bank_ledger (...)
VALUES (..., SYS_CONTEXT('USERENV', 'SESSION_USER'));
6. 查看
6.1 视图
SELECT * FROM user_blockchain_tables;
SELECT * FROM all_blockchain_tables;
6.2 隐藏列
SELECT ORABC_HASH, ORABC_SEQ_NUM, ORABC_USER_SIG
FROM bank_ledger;
7. 保留策略
7.1 NO DROP
- 31 DAYS
- 不可删表
- 保留期
7.2 NO DELETE
- 16 DAYS
- 不可删行
- 保留期
7.3 调整
ALTER TABLE bank_ledger NO DELETE UNTIL 32 DAYS AFTER INSERT;
-- 只能延长
8. 应用场景
8.1 金融
- 账本
- 交易
- 防篡改
8.2 审计
- 审计日志
- 合规
- 不可变
8.3 供应链
- 溯源
- 链式
- 验证
9. 性能
9.1 优势
- 防篡改
- 审计
- 合规
9.2 开销
- 哈希计算
- 签名
- 监控
9.3 限制
- 只能 INSERT
- 保留期
- 大小
10. 监控
10.1 视图
SELECT table_name, row_retention, hash_algorithm
FROM user_blockchain_tables;
10.2 大小
SELECT segment_name, bytes/1024/1024 AS mb
FROM user_segments
WHERE segment_name = 'BANK_LEDGER';
11. 常见问题
11.1 ORA-05715
- 不允许操作
- 检查
11.2 保留期
- 未到期
- 不能删除
11.3 性能
- 哈希开销
- 监控
12. 最佳实践
- 保留期:合理
- 哈希:SHA2_512
- 签名:用户
- 监控:大小
- 审计:定期验证
- 测试:完整性
- 文档:设计
- 合规:审计
- 归档:策略
- 演练:定期
13. 参考资料
[1] Oracle Database Administrator’s Guide 23ai, “Blockchain Tables” https://docs.oracle.com/en/database/oracle/oracle-database/23/admin/