检查表该怎么用?

本文探讨了项目中检查单的两种使用方法:由QA单独完成检查与分工合作。分析了各自的优势与劣势,强调分工合作能更好地发挥团队效能。

项目中用到的检查单一般有两种,一种是过程检查单,一种是工作产品检查单。很明显,过程检查单是对工作过程的检查,工作产品检查单是对工作产品的检查。但不管是哪种检查单,对使用者都有一个基本的要求:能根据实际情况得出检查结果。

但在现实中,经常遇到这样的情况,做QA的既不懂技术也不懂业务,懂业务、懂技术的又不做QA,而公司通过了CMMI的几级几级,为了保住证书又必须有QA的角色和检查结果,该怎么办呢?

办法一:所有检查单的使用者都是QA

方法一是很多公司都使用的方法,那么到底有什么优缺点呢?

优点:项目组的人不需要了解检查表是干什么用的,更不需要明白怎么用,只要专心做项目,必要的时候配合检查,并在被检查出问题的时候进行更正即可。

缺点:QA经常不懂业务也不懂技术,很多工作产品的检查项根本无法得出检查结果,这时候,QA一般有两种做法,一种是不懂装懂,随便得出一个结果,反正这个结果只要项目组的人不反对,也不会有人说什么;另一种是比较敬业的QA,知道自己不明白,所以会与项目组中明白的人一起,得到检查结果,这时候的检查结果是比较真实可信的,但又占用了项目组中项目成员的时间,相当于又做了一遍同行评审。而且QA一般会选择项目中的“专家”帮忙,就更是无形中增加了成本。

方法二:分工合作,各展所长

其实,项目中使用检查单无非是为了检查项目过程或工作产品是否满足公司要求或满足项目要求,而这个目标,与项目目标在本质上是一致的。而且,检查单也并不全是给QA用的。弄明白了这两点,接下来的事情就会容易的多。

在我曾经经历过的一家对日外包、CMMI 3级的软件公司中,检查单是这样用的:

检查单分三种,一种是项目组成员自检用的,一种是小组长用的,一种是QA用的,项目经理可以根据需要,随意选择使用。

自检用的检查单是在每个人做完自己的工作时用的,编码、设计、需求、测试都有,检查单中包括产品检查单和过程检查单。这个检查单的粒度很细,细到代码中的换行、设计中的每页行数、打印格式是否设置、光标是否停在第一个格中、编码完成之后是否通过了编译等等。

小组长用的检查单偏重于工作产品的检查,而且粒度稍粗,不是每个工作产品都检查,有一定的抽查比例,而且检查单上要写明抽查的是哪些,检查结果如何等。

QA的检查单偏重于过程检查单,主要是什么事情做没做,工作产品检查单也大多是定性的检查,只要判断有还是没有就可以了。具体在有的情况下做的怎么样,则是小组长和具体负责人的事。

这样通过分工合作,完成了对项目所有工作产品和过程的检查。

优点是,不存在让不专业的人做专业的事,浪费时间和精力且没有好的结果的现象。而且前期的工作做的比较细致,大大降低了后期出现bug后的修复成本。

缺点是,项目组需要在前期的检查上投入比较大的时间和精力。对很多国内的软件公司来说,老板急着看到工作成果,不管有多少bug,先给我个能将就着用的东西才是最主要的。这种情况下,与其期待着不专业的人做出专业的事,不如直接将这部分工作省掉,或者让专业的人去做,哪怕粒度粗一点。

<think>首先,用户的问题是:“如果用户没有DBA权限,如何安全地检查表是否存在?”这是基于我之前提出的相关问题中的一个。 我需要用中文回答问题。用户的问题是中文的,所以我的回答也应该用中文。 回答完问题后,我必须提出3-5个 §§相关问题§§。这些必须输出在回答的末尾,第一行必须是完整的 "§§相关问题§§",并且不能换行分散。意思是,输出后直接列出问题,不要有空行或其他内容。 从示例格式中,我看到在代码块后面直接输出 "§§相关问题§§",然后列出1. 2. 3. 等。 所以,结构是: - 回答问题 - 如果适用,添加代码块(示例中有Python代码,但这里可能不需要) - 输出 "§§相关问题§§" - 列出3-5个相关问题 在我的上一个回答中,我提到了如果没有DBA权限,可以使用USER_TABLES或ALL_TABLES。现在需要详细解释。 回答问题:如何在没有DBA权限的情况下安全地检查表是否存在。 核心概念: - 在Oracle中,DBA_TABLES需要有DBA权限。 - 普通用户可以使用: - USER_TABLES:查看自己拥有的表。 - ALL_TABLES:查看自己有访问权限的表。 - 所以,在查询时,应该使用这些视图。 步骤: 1. 在源数据库查询。 2. 通过DB Link在目标数据库查询。 3. 但需要确保用户有适当的权限。 安全地:意味着不暴露敏感信息,不引发错误。 示例SQL: - 在没有DBA权限时: - 使用USER_TABLES或ALL_TABLES。 - 在DB Link场景中同样适用。 修改之前的查询: - 替换DBA_TABLES为ALL_TABLES。 - 添加WHERE条件来指定表的所有者,避免混淆。 例如: ```sql SELECT CASE WHEN EXISTS (SELECT 1 FROM all_tables WHERE table_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME') AND EXISTS (SELECT 1 FROM all_tables@db2_link WHERE table_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME') THEN '两个数据库都存在' WHEN EXISTS (SELECT 1 FROM all_tables WHERE table_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME') THEN '仅在DB1中存在' WHEN EXISTS (SELECT 1 FROM all_tables@db2_link WHERE table_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME') THEN '仅在DB2中存在' ELSE '两个数据库均不存在' END AS comparison_result FROM dual; ``` 注意事项: - 需要指定OWNER,因为表可能在不同schema。 - 用户必须有访问ALL_TABLES的权限(通常普通用户有)。 - 在DB Link中,CONNECT TO的用户需要权限。 如果没有DB Link,但用户有权限,可以手动查询。 安全方面:使用参数化查询或绑定变量避免SQL注入,但这里是直接查询,通常安全。 现在,回答结构: - 先解释方法。 - 提供示例SQL代码。 - 注意事项。 - 然后输出 "§§相关问题§§" 和3-5个相关问题。 根据自己的规则,提出相关问题: - 相关问题应基于用户的问题和我的回答。 - 用户的问题是:"如果用户没有DBA权限,如何安全地检查表是否存在?" - 我的回答涵盖了使用ALL_TABLES等。 - 所以,相关问题可以包括: 1. 用户如何获得查看ALL_TABLES的权限? 2. 如果表在不同schema,如何确保安全访问? 3. 如何在没有DB Link的情况下比较不同数据库的表? 4. 最佳实践是什么? 5. 其他相关视图如USER_TAB_COLUMNS的用途。 列出3-5个: 1. 在Oracle中,普通用户如何使用USER_TABLES检查表的存在性? 2. 如何授予用户访问ALL_TABLES的权限? 3. 在没有数据库链接的情况下,如何比较两个数据库的表结构? 4. Oracle中,哪些数据字典视图用于对象存在性检查? 确保有3-5个。 最终响应结构: - 用中文回答。 - 或许添加SQL代码块。 - 然后 §§相关问题§§ - 第一行 "§§相关问题§§" 完整输出。 - 然后1. 2. 3. 等,用点号。 在示例中,问题是用· · ·表示的,但可能是占位符,实际用数字和描述。 在用户的上一个消息中,相关问题列出了具体问题。 所以: §§相关问题§§ 1. 如何在Oracle中创建和使用数据库链接? 2. ... 类似。 现在写作。 </think>在Oracle数据库中,如果用户没有DBA权限,但仍需安全地检查表是否存在,可以使用普通用户可访问的数据字典视图(如USER_TABLES或ALL_TABLES)替代DBA_TABLES。核心方法是:通过DB Link连接到目标数据库,并添加owner条件确保查询精确性以减少权限需求和潜在错误。以下是详细步骤和示例: ### 安全检查方法: 1. **使用替代视图**: - **USER_TABLES**:仅检查用户自己拥有的表(无需额外权限)。 - **ALL_TABLES**:检查用户有访问权限的表(普通用户默认有权限)。 - **关键点**:添加`AND owner = 'SCHEMA_NAME'`条件避免模糊匹配和权限问题。 2. **示例SQL查询**(假设DB Link已创建): ```sql -- 在源数据库执行(替换TABLE_NAME和SCHEMA_NAME为实际值) SELECT CASE WHEN EXISTS (SELECT 1 FROM all_tables WHERE table_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME') AND EXISTS (SELECT 1 FROM all_tables@db2_link WHERE table_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME') THEN '两个数据库都存在' WHEN EXISTS (SELECT 1 FROM all_tables WHERE table_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME') THEN '仅在源数据库中存在' WHEN EXISTS (SELECT 1 FROM all_tables@db2_link WHERE table_name = 'TABLE_NAME' AND owner = 'SCHEMA_NAME') THEN '仅在目标数据库中存在' ELSE '两个数据库均不存在' END AS comparison_result FROM dual; ``` - **输出示例**:如果表"EMPLOYEE"在schema "HR"中存在,则返回具体状态。 - **优点**:安全、无需DBA权限,查询快速。 3. **安全注意事项**: - **权限控制**:确保用户有`SELECT`权限访问ALL_TABLES(默认授予),避免使用高权限账户。 - **错误处理**:使用`EXISTS`子句防止全表扫描,减少性能影响;添加schema名称避免跨schema冲突。 - **无DB Link方案**:如果DB Link不可用,手动查询每个数据库(需用户登录),或使用工具如Oracle SQL Developer的"Export DDL"功能比较。 - **最佳实践**:在开发环境测试查询,避免生产环境意外操作;使用绑定变量防止SQL注入。 此方法在秒级内完成,适合日常监控。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值