学习中遇到的问题
- 问题1
a.问题背景
表结构
- 1.学生表
Student(SId,Sname,Sage,Ssex)
SId学生编号,Sname学生姓名,Sage出生年月,Ssex 学生性别 - –2.课程表
Course(CId,Cname,TId)
CId课程编号,Cname 课程名称,TId 教师编号 - –3.教师表
Teacher(TId,Tname)
TId教师编号,Tname教师姓名 - -4.成绩表
SC(SId,CId,score)
SId学生编号,CId 课程编号,score 分数
b.问题描述
查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
c.问题解决
- 尝试1
网上搜索到的方法为使用group_concat()函数:
(1)将sc表按sid分组后的cid字符串拼接
(2)将01同学的字符串与其他同学相比。
此方法经过尝试并不能在oracle实现,可能原因:是其他数据库的特有函数
解决失败 - 尝试2
继续思考一个小时,得出了正确逻辑:
(1)排除没有学习01同学课程的同学(not in / !=any)
(2)再此基础上筛选出和01同学课程数相同的同学(count)
解决成功
- 问题2
a.问题描述
无论输入任何账户或者密码,只要选择dba身份登录都可以登录。
使用select user from dual 查看用户可知:任何登录成功都实际为sys用户。
b.出现原因
在查找相关资料后明白真正的原理:
Oracle认证用户有两种方式:操作系统认证与口令认证。操作系统认证也叫本地认证。
- 操作系统认证:Oracle认为操作系统用户是可靠的,那么既然你能登录到操作系统,必然也能登录到数据库;
- 口令文件认证:Oracle认为操作系统用户是不可靠的,如果要访问数据库,必须再次使用密码认证。
c.问题解决
将操作系统认证改为口令文件认证:
将sqlnet.ora中 SQLNET.AUTHENTICATION_SERVICES= (NTS) 屏蔽(前面加#)