# PostgreSQL 只读访问隔离演练 全部为合成数据。仅供数据库管理员在新建隔离数据库中检查后运行,未在生产执行。不设置真实密码,登录认证由管理员在隔离环境配置。角色名已存在时请换用新隔离库,不要覆盖现有角色。 ## 管理员初始化 ```sql CREATE SCHEMA agent_demo; CREATE TABLE agent_demo.orders ( order_id text PRIMARY KEY, region text NOT NULL, status text NOT NULL, internal_note text NOT NULL ); INSERT INTO agent_demo.orders VALUES ('ORDER_DEMO_01','east','open','合成内部备注甲'), ('ORDER_DEMO_02','east','closed','合成内部备注乙'), ('ORDER_DEMO_03','west','open','合成内部备注丙'); CREATE VIEW agent_demo.allowed_orders AS SELECT order_id,region,status FROM agent_demo.orders WHERE region='east'; CREATE ROLE agent_demo_reader NOLOGIN; GRANT USAGE ON SCHEMA agent_demo TO agent_demo_reader; GRANT SELECT ON agent_demo.allowed_orders TO agent_demo_reader; ``` 管理员可在隔离会话 SET ROLE 后演练,或把该角色授予另建的专用测试登录;不得使用生产管理员凭据作为Agent运行账户。 ## 测试一:允许查询 ```sql SET ROLE agent_demo_reader; SELECT * FROM agent_demo.allowed_orders ORDER BY order_id; RESET ROLE; ``` 预期:只返回 ORDER_DEMO_01 与 ORDER_DEMO_02,列中没有 internal_note。实际结果:________。 ## 测试二:更新视图必须拒绝 ```sql SET ROLE agent_demo_reader; UPDATE agent_demo.allowed_orders SET status='changed' WHERE order_id='ORDER_DEMO_01'; RESET ROLE; ``` 预期:权限拒绝,管理员复核原状态仍为 open。发生错误后按客户端事务状态先回滚,再 RESET ROLE。实际结果:________。 ## 测试三:直接读取源表必须拒绝 ```sql SET ROLE agent_demo_reader; SELECT * FROM agent_demo.orders; RESET ROLE; ``` 预期:权限拒绝。实际结果:________。 ## 接手前补查 - 专用登录是否继承其他写权限或高权限角色:________。 - 是否具备不必要的函数、扩展、源表和其他schema权限:________。 - 连接池每次请求的身份与事务是否被可靠重置:________。 - 查询超时、返回条数、权限撤销与审计证据:________。