数据库原理疑难问题解答选

1、Interbase怎么与Access联接?
答:首先在ACCESS中建立数据库,并为这个数据库指定访问的别名以及用户名和口令,然后在Interbase中建立一个外部数据库联接(注意是使用当初指定的数据库别名),在用户名和口令处指定为先前设置的用户名和口令,在程序设计语言中使用一个数据库对象,设置好这个对象的相关属性(包括数据库别名、用户名及口令等),这样就可以通过这个对象访问Access数据库了。

2、Access是否可以用来建立网站留言板?
答:应当是可以的,但一般来说不使用它作留言板的后台数据库,因为Access适用的对象是中小型企业的数据库管理,一般网站留言板都应使用较大型的数据库作平台,所以建议使用SQL或Oracle等。

3、MYSQL与SQL谁更适合在UNIX中使用。
答:当然应当是MYSQL,因为MYSQL对于UNIX来说兼容性更好。

4、请问Interdev和Ultradev哪个和SQL2000兼容性好。
答:我想应是Interdev更好一些,因为在SQL2000和Interdev中有许多地方是相容的,而且他们可以联合起来开发应用程序,对于Ultradev来说只是使用上更方便一些。

5、请问怎样将数据库中的数据放入到EXECL中
答:在WIN9X操作系统中首先要有相在数据库的驱动程序,若没有就先安装,然后就可以在EXECL中直接打开相关的数据库文件。在有些数据库中还可以只指通过两个程序进行数据拖放来实现,如ACCESS等。

6、如何进行数据库设计?
答:数据库设计包括两个组成部分:逻辑设计和物理设计。逻辑数据库设计包括使用数据库组件(如表和约束)为业务需求和数据建模,而无须考虑如何或在哪里物理存储这些数据。物理数据库设计包括将逻辑设计映射到物理媒体上、利用可用的硬件和软件功能使得尽可能快地对数据进行物理访问和维护,还包括生成索引。
要在设计后更改这些组件很困难,因此在数据库应用程序开发的早期阶段正确设计数据库、使其为业务需求建模,并利用硬件和软件功能很重要。

7、我们的计算机在进行数据查询时速度很慢,可能由哪些因素引起?
答:
A、网络通讯速度慢。
B、服务器计算机的内存不足或 Microsoft SQL Server 2000 可用的内存不足。
C、缺少有用的统计数据。
D、统计数据过期。
E、缺少有用的索引。
F、缺少有用的数据条带化。
8、在VFP中怎样实现用递归的方法求数的阶乘?
答:程序如下:
递归子程序:
func abc(n)
if n>=1 then s=n*abc(n-1)
else
retu
endfunc
调用主程序
set talk off
@13,13 say " " get n
read
abc(n)

9、学习SQL需要什么基础?
答:学习SQL需要一些基本的数据库基础知识,比如,可以学习FOXBASE、VFP及ACCESS。

10、SQL Server的事务处理日志如何处理?
答:可以通过SQL Server的企业管理器来处理相关的日志,或者通过SQL的日志查看器来处理。

11、如何将SQL 7的数据转换成SQL 2000的数据?
答:使用复制数据库向导可以从 Microsoft SQL Server 7.0 向 Microsoft SQL Server 2000 实例移动或复制数据库,数据库复制向导基于分离和附加功能,该功能允许将用户数据库从源服务器移动或复制到目的服务器。数据转换服务 (DTS) 包执行实际的移动或复制操作。可以调度该包在指定的时间运行或必要时重新运行。
    数据库管理员可以将一个或多个数据库从 SQL Server 7.0 实例移动或复制到您的本地计算机上的 SQL Server 2000 默认实例,或者到远程计算机上的默认或命名实例。该升级功能不支持 SQL Server 6.5 数据库。

12、如何配置日志传送?
答:使用数据库维护计划向导配置日志传送。
    在配置日志传送之前,必须在主数据库上创建一个共享以使事务日志可用。这是从事务日志转储目录创建的共享。例如,如果将日志转储到目录 e:\data\tlogs\,则可以从该目录创建 \\logshipping\tlogs 共享。
    ⑴.在"选择数据库"屏幕上,选择"如下数据库"复选框,然后选择要进行日志传送的数据库。如果选择了多个数据库,则不会执行日志传送,日志传送选项也不可用。不允许选择已配置了日志传送的数据库。
    ⑵.选择"将事务日志传送到其它的 SQL Server(日志传送)"复选框。
    ⑶.继续执行向导,指定其余的数据库维护选项,直到到达"指定日志传送目的"屏幕。
    ⑷.单击"添加"按钮添加目的数据库。要使该选项可用,必须已经在向导的前面步骤中选择了使用日志传送。
    ⑸.在"添加目的数据库"屏幕中,选择一个服务器名。
该服务器必须已经注册,而且正在运行 Microsoft SQL Server 2000 企业版,这样才能显示在下拉列表中。如果要使该目的成为可用的源目的,必须选择"允许数据库采用主角色"复选框。如果该复选框未被选中,则该目的数据库将来就无法采用源目的角色。如果已选定"允许数据库采用主角色"复选框,还必须在日志将要备份到的目的数据库中指定"事务日志备份目录"。
    ⑹.若要从默认位置更改事务日志目的数据库,请在"目录"框中输入一个位置。
    ⑺.如果源数据库不在目的数据库上,则选择"创建新数据库"复选框。"数据库名称"框将默认为源数据库名。如果想要在目的服务器上用另一个数据库名,则指定一个新名称。如果已经选择了允许该目的数据库承担源角色,就无法从默认值改变该数据库的名称。
    ⑻.如果已经选择了"创建新数据库"复选框,则还必须在"用于数据"和"用于日志"框中指定目的数据库上数据和日志的文件目录。
    ⑼.如果源数据库已经存在于目的数据库上,则选择"使用现有数据库"复选框。如果目的服务器上的数据库名不同,则在"数据库名称"框中输入该名。该数据库必须是使用 WITH STANDBY 选项还原过的,以便正确接受日志。
    ⑽.在"初始化目的数据库"屏幕上,执行下列操作之一:
单击"立即提取完全数据库备份"。
-或-单击"使用最新备份文件"以初始化目的数据库。
    ⑾.在"日志传送调度"屏幕上,查看默认的日志传送调度。如果要改变调度,请单击"更改"。
    ⑿.在"复制/装载的频率"框中,设置希望目的服务器从源服务器备份和还原事务日志的频率(以分钟计)。
    ⒀.在"装载延迟"框中,设置希望目的数据库从源服务器还原事务日志之前要等待的延迟(以分钟计)。该框的默认值为 0 分钟,表示目的数据库应立即还原所有事务日志备份。
    ⒁.在"文件保持期"框中指定事务日志在删除之前应该存留的时间长度。
    ⒂.从"日志传送阈值"对话框中,设置"备份警报阈值"。
这是距离源服务器上一次事务日志备份时间的最长期限。一旦时间超过此指定阈值,监视服务器将生成警报。
    ⒃.在"不同步警报阈值"框中,指定源服务器上最近一次事务日志备份与目的服务器最近一次事务日志还原之间的时间。一旦时间超过此指定阈值,监视服务器将生成警报。
    ⒄.在"指定日志传送监视器信息"屏幕中,键入将监视日志传送的服务器名称。
单击"使用 Windows 身份验证"或"使用 SQL Server 身份验证"连接到监视服务器。log_shipping_monitor_probe 登录名是固定的,必须使用它连接到监视服务器。如果这是一个新帐户,则选择一个新密码。如果该帐户已经存在于监视服务器上,则必须指定现有的密码。
说明 使用数据库维护向导设置日志传送,只可以向磁盘传送日志,而不能使用"备份到磁带"选项。

13、如何管理或查看 SQL Server 消息(企业管理器)?
答:管理或查看 SQL Server 消息
    ⑴、展开一个服务器组,然后右击一个服务器。
    ⑵、指向"所有任务",然后单击"管理 SQL Server 消息"命令。
    ⑶、若要指定搜索选项,请执行以下一个或多个操作:
在"消息正文包含"框中,键入要搜索的文本。
在"错误号"框中,键入要搜索的错误号。
在"严重度"下,选择要搜索的严重级别。
    ⑷、若要指定要包含的消息,请执行下列操作之一:
选择"仅包含已日志记录的消息"复选框。
-或-选择"仅包含用户定义的消息"复选框。
    ⑸、单击"查找"以查找所有满足搜索条件的消息

14、要学习SQL2000应先掌握哪些知识?
答:若要学习SQL2000可以先学习一些数据库基础方面的知识,如:FOX、ACCESS等,然后学习SQL2000的操作方面知识,再学习SQL2000 SERVER。

15、对于学生管理软件应考虑哪些方面的问题?
答:首先:应进行需求分析,因为我们开发的软件都是为用户服务的,若脱离客户而开发,那么开发出来的东西是没有用的。
    其次:考虑程序开发的模块和算法,对于开发的软件应将它细化,分成若干多个模块,每一个实现一部分功能,这样开发的程序结构清楚。另外就是算法,算法是解决问题的关键,没有好的算法,我们编出的程序效率也是不高的。
    第三:就是数据库的确立,好的数据集合对我们开发者来说是事半功倍,反之就会徒劳,另外的方面就是数据平台,平台的好坏对程序的移植和通用性是非常关键的。

16、为什么我建的数据库在有的机器上能打开,在有的机器上不能打开?
答:可能的原因有:
    ⑴、所使用的数据库平台不一样,如SQL的数据库在ACCESS上是不能打开的,反之也一样。
    ⑵、所使用软件版本不一样,一般来说,同一数据库平台高版本可以打开低版本的,但低版本不能打开高版本的。
    ⑶、在移置的过程中数据库损坏。

17、学习SQL Server多久才能精通?
答:这个问题不能肯定的回答,因为自身因素很重要,若认真学,时间能保证,那最多一个月一定能入门的,要说精通就不一定了,不过多的实验对熟悉的帮助是很大的,对这个问题再熟悉的人可能都不敢说精通。

18、SQL的作用是什么?
答:能常意义上讲的SQL是指数据库查询语言,主要用于数据库的操作、管理和查询。对于SQL来说它又分了两方面,即SERVER和CLIENT,SERVER主要提供数据库平台,用于数据库的建立、管理等,而CLIENT主要是提供数据库连接和操作。

19、如何书写数据库报告?
答:书写数据库报告可从以下方面进行考虑:
    ⑴、数据库建立的环境和必要性
    ⑵、数据库建立的平台
    ⑶、数据库建立的具体细节
    ⑷、操作的方法和技巧
    ⑸、安全性和稳定性
    ⑹、可移植性和兼容性
    ⑺、其他

20、为什么按照书上书写的SQL语句在Visual Foxpro中不能执行?
答:Visual Foxpro中的SQL语句与书上书写的标准SQL语句有一些微小的差别,要依据Visual Foxpro中SQL语句的语法规定。同样SQL Server中书写的SQL语句要符合SQL Server中SQL语句的语法规定。
21、在什么情况下使用CLUSTERED INDEX 在什么情况下使用nonclustered index呢?
答:聚集 聚集索引基于数据行的键值在表内排序和存储这些数据行。由于数据行按基于聚集索引键的排序次序存储,因此聚集索引对查找行很有效。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。数据行本身构成聚集索引的最低级别。
    包含聚集索引时,表内的数据行才按排序次序存储。如果表没有聚集索引,则其数据行按堆集方式存储。
    非聚集索引具有完全独立于数据行的结构。非聚集索引的最低行包含非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。数据行不按基于非聚集键的次序存储。
    索引内,从索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页的存储方式是堆集还是聚集。对于堆集,行定位器是指向行的指针。对于有聚集索引的表,行定位器是聚集索引键。
    创建了聚集索引时,表内的行才按特定的顺序存储。这些行就基于聚集索引键按顺序存储。如果一个表只有非聚集索引,它的数据行将按无序的堆集方式存储。
    另外如果大多数引用 emp_sample 的查询在它们的 WHERE 子句中有关于 emp_id 的等式或范围比较,聚集索引将发挥很好的作用。如果大多数查询的 WHERE 子句引用的是 emp_name 而非 emp_id,则通过将 emp_name 上的索引置为聚集索引可提高性能。

22、在VFP中如何像VB一样能显示所有控件代码?
答:使用VFP中的类设计器即可。

23、在多CPU的机器中,网卡是否总是使用高序号的CPU呢?
答:不一定,在网络操作系统中,可以使用多个CPU,CPU之间是协作式工作,而不是分工,所以网卡不一定总使用高序号的CPU。

24、你觉得SQL2000 SERVER是管理难学还是编程难呢?
答:针对MCDBA而言相对来说应当是管理比编程难,因为编程只要熟悉了SQL的相关东西和编程的算法要领,问题就不大了。而管理并不是熟悉SQL SERVER就行,而要对出现的各种情况都要能应对,不然即便出现一个很小的问题都会让你束手无策。

25、现在学那种数据库最好?
答:这个问题已经很多同学问了,其实每一种数据库都有它存的价值,不然已经被淘汰了。所以这之中没有最好,只有最适合,应当说最适合学或用哪种数据库。其实几种数据库都很好,ACCESS主要针对中小型企业管理而作为他们数据库平台,VFP则多用于开发数据库应用程序,MCDBA主要针对MC认证,它之中涉及到SQL2000的管理和应用程序设计,这主要是当前大多大中型企业和网站使用的数据库平台和开发工具。所以致于哪种最好,应当说适合自己的就是最好的。

26、问:ACCESS、VFP、SQL有什么区别?适应的环境有什么不同?
答:ACCESS、VFP、SQL都是针对数据库管理而开发的三个软件,只是在使用的时候,ACCESS主要用于中小型企业的数据库管理系统,VFP主要适用于开发数据库管理系统的应有型开发软件,SQL主要针对于大中型企业的数据库平台。

27.ODBC数据源的具体含意及与其相关的操作有那些?
答:ODBC是一种编程接口,它能使应用程序访问以结构化查询语言(SQL)作为数据访问标准的数据库管理系统。相关的操作有配置数DNS和数据库访问引擎。在应用程序中我们首先要配置ODBC数据源使它能指定到一个具体的数据库,并为这个数据库命名一个应用程序访问的别名,这样在应用程序中我们就可以通过访问这个别名来访问相关数据库。

28.网页中,需要将“记录表”格式化,然后甲方填表后,由乙方检查补充,再打印保存为数据库并自动编号。还可按格式化自动查询“记录表”,要实现此类功能,应用什么技术可实现,我应该学习哪些网页编辑软件或技术才能实现。
答:要实现此类功能,使用可以先学习一些数据库方面的知识,在其中就讲到了相关的技术,如:SQL、Oracle等,另外就是要了解一些有关网络数据库的配置技术,如SQL Server 、ODBE 、Inerbase等。作为网页编辑软件来说,现在很多软件都是可行的,我认为要好用一点的就是DREAMWEAVER等。

29.请问SQL2000中的“实例”是什么意思,因怎样理解呢?
答:SQL实例简单的说就是一个SQL的进程,类似于操作系统中的进程,它有两种,即:
SQL Server 的默认实例。
    此实例由运行它的计算机的网络名称标识。使用以前版本 SQL Server 客户端软件的应用程序可以连接到默认实例。SQL Server 6.5 版或 SQL Server 7.0 版服务器可作为默认实例操作。但是,一台计算机上每次只能有一个版本作为默认实例运行。
    SQL Server 的命名实例。
    该实例通过计算机的网络名称加上实例名称以<计算机名称>\<实例名称>格式进行标识。应用程序必须使用 SQL Server 2000 客户端组件连接到命名实例。计算机可以同时运行任意数目的 SQL Server 命名实例。同时,命名实例还可作为现有的 SQL Server 6.5 版或 SQL Server 7.0 版安装运行。该实例名不能超过 16 个字符。

30.SQL中什么是DTS,主要的作用是什么?
答:DTS就是SQL提供的数据转换服务,使用它可以导入和导出SQL数据。

31.我有一个数据库是架设在SQL Server2000上的,我想把它转回SQL7.0,但SQL2000的bak文档不能在SQL7.0里恢复,请问有办法让SQL2000转回SQL7.0吗?
答:在 SQL Server 2000 的实例上创建的 DTS 包不能装载到或运行于 SQL Server 7.0 版(或早期版本)的实例上。如果试图这么做,则可能会收到下面消息中的一个:
    "无效的类字符串。" "参数不正确。"
    两条消息都指明:当前的服务器并不包含用于装载该包所必须的所有组件,并且不能支持在 DTS 包中所定义的对象(例如任务及转换)。
    但是,如果收到这两条消息中的一条,仍然可以在 SQL Server 2000 实例上打开并运行包。
    当然要将SQL2000中的数据库移植到SQL以前的版本中还有一个方法就是它提供的数据库复制向导。

32、如何才能为VF6.0设计一个简单的启动程序?利用表单可以吗?我不想脱开VF?
答:你可以写一个脚本,在系统的注册表中加入名称,利用表单也可以。

33、请问在SQL中的char、nchar、nvarchar、varchar四种数据类型,它们之间有何区别?如何用?
答:char是定长的数据类型,varchar是变成数据类型,nchar和nvarchar相同,但针对多字节nchar定长,nvarchar变长。

34、编程后不脱离VF和脱离有何利弊?
答:没什么利弊可言。

35、ORACLE数据库的超级用户名称和密码是什么?
答:system/manager。

36、char和nchar各自最多可存贮多少字节的内容?
答:都是4000个字节。

37、有关MSSQL7的参考书,老师能否给我推荐一下?
答:买什么书主要看你需要哪方面的资料。

38、请问VF的数据可以上传至SQL服务器?
答:当然可以,如可以参考微软的资料。
39、可不可以客户端用VF而服务器用大型的数据库?
答:当然可以,我以前作过很多这样的项目。

40、/dev/null的null是什么?
答:表示空值、或长度为0的值。

41、VF与哪些大型数据库兼容?
答:Oracle,DB2,SQL Server等都可以。

42、哪种大型的数据库易学易用?
答:SQL Server容易学点。

43、在MYSQL中怎样使用unix shell建库?
答:先用脚本写一个批处理文件然后用shell调用(给予执行权然后就可以执行)。

44、VF中的主关键字段名在数据库建好后还能改名吗?
答:可以修改。先删除现有的PK,然后重建。

45、请问何为pk?
答:primary key(主关键字)。

46、删除pk后各表之间的联结都断了,怎么办?
答:删除后还得把关联加上是比较麻烦一些,但能恢复。

47、informix中可用/informix/bin/isql 调用isql建库,但在MYSQL中怎么用?
答:因为MYSQL是运行在unix/linux平台上的所以用起来会难一些,每一种数据库都有各自的特点,但会一种之后另一种就很容易了。

48、我的程序为什么不能打包为mdb格式,是因为有宏吗?
答:有宏也可以打包成mdb格式。

49、对变量名访问的时候,m.与m->是什么命令?起什么作用?
答:m.中,m是父类名,m->主要用在引用m的对象。

50、请问如何在局域网里共享数据库?
答:要在局域网中共享数据库,一般需要一台数据库服务器,前台用浏览器或者其他程序对它进行存取访问。

51、SQL Server 和Oracle 哪个更好?
答:SQL Server属于中型数据库,它没有Oracle通用,但是SQL Server 和NT操作系统结合比较紧密。

52、SQL的全称是?
答:SQL的全称是Structured Query Language(结构化查询语言)

53、大型数据库除了SQL Server和Oracle,还有哪些?
答:常见的还有Sysbase,DB2和Informix等。AS400则是把硬件,操作系统和数据库都集成到了一起。

54、怎样才能学好SQL数据库?
答:我觉得关系数据库很多概念都是相通的 不管你学SQL Server还是Access,首先都要注意建立起一些基本的概念,比如说表、查询、关键字等。然后熟悉数据库管理系统的窗口环境,掌握怎样创建各种对象,如何修改各种设置项或者属性。

55、请问怎样选择使用哪种数据库?
答:那要看具体应用的规模和条件了,一般VFP和access属于桌面数据库,对于小型的应用性能还是不错的。网络环境下一般用SQL Server和Oracle。
    Oracle数据库以其强大的功能和稳定性而著称,但同时,在开发和管理方面也存在很多困难,在此总结了一些Oracle数据库开发和管理的常见问题,希望能对大家有所帮助。

56、如果发现表中有坏块,如何检索其它未坏的数据?
答:首先需要找到坏块的ID(可以运行dbverify实现),假设为1234。运行下面的查询语句查找段名:
    select segment_name, segment_type, block_id, blocks from dba_extents
where (1234 between block_id and (block_id + blocks - 1));
一旦找到坏段名称,若段是一个表,则最好建立一个临时表,存放好的数据。若段是索引,则删除它,再重建。
create table good_table
as
select ? from bad_table where rowid not in
( select /?+index(bad_table, any_index)?/ rowid
from bad_table where substr( rowid, 1, 8 ) = 1234)
57、如请问如何关闭FORM调用REPORT时的小窗口?
答:在利用Oracle数据库的Develop 2000设计开发界面的过程中,当FORM调用REPORT时,会显示一个背景窗口REPORT BACKGROUD ENGINE,等待FORM对REPORT的调用,当FORM调用其它REPORT时,也使用这个后台服务器,不论调用多少个REPORT,这个后台服务器存在且只有一个。但当FORM与REPORT全部退出后,该窗口仍处于等待状态,不会关闭,这时,我们需要手工将其关闭。
    我们可以使用以下参数在FORM调用REPORT时不显示这个小窗口:
    Add_Parameter( pl_id, 'ORACLE_SHUTDOWN',TEXT_Parameter, 'Yes' );
    需要注意的是,该参数必须加在所有参数的前面,即它必须为第一个参数。
58、请问如何根据查询条件在REPORT中动态显示记录?
答:
    ⑴. 在REPORT的“数据模型”下面的“用户参数”中,创建用户自定义参数W_CLAUSE,W_CLAUSE为从FORM传递过来的查询条件,数据类型为字符型,缺省值为NULL。
    ⑵. 修改查询Q_1,将SQL查询语句修改为select ? from dept &&w_clause。
    ⑶. 在运行报表时,报表会自动将符合&&w_clause的查询条件记录显示出来。
    如果从FORM传递过来的w_clause为where dept=1,本报表的SQL查询自动转换为:
    select from dept where dept=1,并在报表运行结果中显示符合该查询条件的记录,如果从FORM传递过来的w_cluase为where to_char(年度,'YYYY.MM')='2000.03',则在报表运行结果中自动显示2000年3月份的记录。
59、在Oracle中,我们如何查看某表上的约束?
答:我们可以使用下面语句从all_constraints视图中查看某表上的约束:
    SELECT constraint_name, table_name, r_owner, r_constraint_name FROM all_constraints
WHERE table_name = 'table_name' and owner = 'owner_name';
    另一个视图ALL_CONS_COLUMNS也包括组成表上约束列的信息。
60、如何将数据库从noarchivelog方式改变为archivelog方式?
答:首先打开Init.ora文件,确保存档日志目标指向一有效目录。
    然后启动Server Manager
    svrmgrl〉 shutdown immediate
    svrmgrl〉 startup mount
    svrmgrl〉 alter database archivelog;
    svrmgrl〉 alter database open;
    svrmgrl〉 archive log list;
    在init.ora中设置参数archive_log_start=TRUE,它设置存档日志为自动启动。在Oracle 8i中支持多个存档日志的目标,因此参数修改为log_archive_dest[n],其中n为1到5。
61、在Oracle数据库中,我们如何增加表空间的大小?
答: 在开发Oracle数据库中,我们有两种方法增加表空间的大小:
    ⑴.增加额外的数据文件到表空间中
    例如:alter tablespace users add datafile '/u01/oradata/orcl/users02.dbf' size 25m;
    ⑵.修改表空间当前的数据文件
    例如:alter database datafile '/u01/oradata/orcl/users01.dbf' resize 50M;
62、请问如何在REPORT中设置动态显示域?
答:在REPORT中设置动态显示域的方法如下:
    ⑴. 在REPORT的“数据模型”下面的“用户参数”中,创建用户自定义参数,如RQ,RQ是从FORM传递过来的显示日期,数据类型为字符型。
    ⑵. 在布局模型中,创建一个显示域F_1,在属性选项板中修改该显示域的源为用户自定义参数RQ,并且设为“不可见的”。
    ⑶. 在动态预览中,创建一个文本域D_1,调整该文本域的位置和宽度,在该域的内容中输入&&F_1,则该域会动态显示用户定义参数RQ的值。
63、有关口令的问题。
我在Solaris系统上运行 Oracle8i 8.1.7企业版。我创建了两个数据库:SUGAR和TestDb。将两者的remote_login_passwordfile都设置为 “独占(exclusive)”。我试图以SYSDBA身份连接到TestDb,但未能成功。下面是我的做法:
$sqlplus /nolog
SQL> conn sys/change_on_install@testdb
Connected.(已连接)
SQL> select * from v$pwfile_users;
username sysdb sysop
-----------------------------------------
internal true true
sys true true
SQL> conn sys/change_on_install@testdb as
sysdba
ERROR(错误)
ORA-01017: invalid username/password; logon
denied(无效的用户名/口令,登录被拒绝)
Warning: You are on longer connected to
ORACLE(警告:你已经与ORACLE断开连接)
64、我为什么不能以SYSDBA身份连接到TestDb?
答:通常Oracle中的SYS口令与INTERNAL口令是同步的,SYS口令存储于口令文件中。在上述情况下你建立了包含有一个口令的口令文件,而不是使用缺省的 “change_on_install,”这就是问题之所在。
希望下面的方法对你有所帮助。首先,建立一个口令文件,其中包含一个口令,这个口令不要与系统口令匹配:
$ orapwd file=orapw password=foobar
entries=40
然后,进入服务器,启动数据库:
$ svrmgr
SVRMGR> connect internal
Connected.(已连接)
SVRMGR> startup
ORACLE instance started.(ORACLE 实例已启动)
Total System Global Area (系统全局区域大小)
193073136 bytes
Fixed Size (固定大小)
69616 bytes
Variable Size (可变大小)
141639680 bytes
Database Buffers (数据库缓冲区)
45056000 bytes
Redo Buffers (重做缓冲区)
6307840 bytes
Database mounted. (数据库已加载)
Database opened.数据库已打开。
现在使用SYS用户的口令,以SYS身份连接:
SVRMGR> connect sys/change_on_install@ora81
Connected.(已连接)
成功了。现在试着以SYSDBA身份连接:
SVRMGR> connect sys/change_on_install@ora81
as sysdba;
ORA-01017: invalid username/password; logon
denied(无效的用户名/口令;登录被拒绝)
这里出现了你所说的错误。你的SYS口令为:change_on_install,但口令文件中的口令却是foobar。SYS用户是专用的,以SYSDBA身份连接就像是以INTERNAL连接,你必须使用口令文件中的口令。试试这样做:
SVRMGR— connect sys/foobar@ora81 as sysdba;
Connected.(已连接)
并不是每个人都需要使用口令文件中的口令;用户需要使用他们自己的口令。通过授权SYSDBA给SCOTT,你就可以明白这一点:
SVRMGR> grant sysdba to scott;
Statement processed.(已处理)
这个命令将SCOTT以SCOTT的凭证加入到口令文件中。如果你改变了SCOTT的口令,口令文件也会自动同步改变。现在,你可以试试以SYSDBA身份连接SCOTT了:
SVRMGR> connect scott/tiger@ora81 as sysdba;
Connected.(已连接)
一切正常。现在可以使用ALTER USER 命令来改变SYS用户的口令。
SVRMGR> alter user sys identified by
change_on_install;
Statement processed.(已成功更改)
SVRMGR&Gt; connect sys/change_on_install@ora81
as sysdba;
Connected.(已连接)
你还可以用change_on_install,因为改变SYS用户口令将同时改变口令文件中的口令。当你建立了口令文件后,Oracle数据库在其中放入两个账号:SYS和INTERNAL,并将你在命令行中提供的口令作为这两个账户的口令。当你改变数据库中的SYS用户口令时,数据库将冲掉口令文件中的SYS和INTERNAL口令。下面操作将显示口令foobar已经是无效的了:
SVRMGR> connect sys/foobar@ora81 as sysdba;
ORA-01017: invalid username/password; logon
denied(无效的用户名/口令,登录被拒绝)
65、利用QUERY选项输出数据。
我知道在Oracle8i中,可以使用QUERY有选择地输出表数据。我想用EXP命令来实现,但没有成功。下面是我所写的命令,以及得到的错误信息:
exp ddd/ddd file=/dbf/u11/customer.dmp
tables=AASC.AST_CUSTOMER_KEEP
query=\'where CUA_TRANS_DTS \<
add_months\(sysdate, -6\)\'
table_export[2]: CUA_TRANS_DTS: not found.(没有找到)
答:操作系统不同,用来指定QUERY=参数的方法也不同。WHERE 语句里面往往有很多特殊的字符,如=.>.<和空格等等。而UNIX和Windows操作系统中的外壳命令提示是不欢迎这些字符的,这些字符将被忽略。你应该根据不同的操作系统采用不用的方法。我一般使用带有QUERY选项的参数文件(PARFILE),利用PARFILE,可以不考虑操作系统平台而使用完全相同的方法。
下面给出一个例子。我用select * from all_objects建立了一个表T,我希望输出所有object_id 小于5000的行。在Windows中,必须这样做:
C:\exp>exp userid=tkyte/tkyte tables=t
query="""where object_id < 5000"""
注意:在windows中,需要在WHERE语句的两端使用三个双引号。在UNIX中,必须这样做:
$ exp userid=/ tables=t query=\"where
object_id \< 5000\"
exp userid=/ tables=t parfile=exp.par
如果使用包含query="where object_id < 5000"的PARFILE文件,我可以在两个系统中使用相同的一个命令:
exp userid=/ tables=t parfile=exp.par
在两种操作系统中,完全相同。这相对于在不同的平台中使用不同的QUERY字符串容易多了。
66、DBMS_RANDOM。
您能否告诉我写一个能产生大于0小于1的随机数的随机数产生器的最好方法?
答:Oracle8 8.0版介绍了DBMS_RANDOM包,Oracle8i 8.1.6版介绍了DBMS_RANDOM包的新功能,但Oracle8i 文档中没有详细全面介绍其功能。幸运的是:有一个新的DBMS_RANDOM包函数能够返回0-1之间的随机数。这个新函数是:
FUNCTION value RETURN NUMBER;
FUNCTION value (low IN NUMBER, high IN NUMBER) RETURN NUMBER;
FUNCTION normal RETURN NUMBER;
FUNCTION string (opt char, len NUMBER)
RETURN VARCHAR2;
VALUE函数的第一种形式返回一个大于或等于0且小于1的随机数;第二种形式返回一个大于或等于LOW,小于HIGH的随机数。下面是其用法的一个示例:
SQL> select dbms_random.value,
dbms_random.value(55,100)
2 from dual;
VALUE DBMS_RANDOM.VALUE(55,100)
--------------- -----------------------------
.782821936 79.6367038
NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。事实上,这就是你在清单1中所看到的。
最后,是STRING函数。它返回一个长度达60个字符的随机字符串。参数OPT可以是清单2显示的值中的任何一个单个字符。
关于这些函数及DBMS_RANDOM包的文件都包含在SQLPlus中:
select text
from all_source
where name = 'DBMS_RANDOM' and type = 'PACKAGE' order by line;
67、连接次序与谓词求值。
在下面的查询中,WHERE 语句的哪一部分先执行?
Select field names from emp, dept
where emp.dept_num = dept.num and
emp.name Like 'S%' and dept.name='IT';
答:执行次序随已有的索引、统计、和session/init.ora参数的不同而变化。
假定已有一个建立在DEPT(name)和EMP(dept_num)上的索引。假定优化器认为DEPT是唯一的,它可能按下面的顺序进行操作:
利用建立在DEPT(name)上的索引查找dept列
利用建立在EMP(dept_num)上的索引查找匹配的emp列(即连接emp.dept_num = dept.num)
依据建立在emp.ename like 'S%'进行过滤
现在,我们假定没有建立在EMP(dept_num)上的索引,也没有建立在DEPT(name)上的索引,而存在建立在EMP(name)和DEPT(num)上的索引。优化器可能按下面的次序进行操作:
利用建立在EMP(name)上的索引找到带有S的EMPS
利用建立在DEPT(num)上的索引找到匹配项
根据dept.name = 'IT'过滤结果
谓词求值的次序是不确定的,可以随时间的改变而改变,并由优化器决定。不要假定任何事情会按一定的次序发生。如果你那么做,随着时间的推移,你的应用程序可能会出现一些看起来非常奇怪的错误。看以下的例子:建立一个表,输入一些数据。当X='a’时,第二列的数据“Y”是一个数值,当X='b’时,“Y”不是数字。
SQL> create table t ( x varchar2(1), y varchar2(1) );
Table created.
SQL> insert into t values ( 'a', '1' );
1 row created.
SQL> insert into t values ( 'b', 'x' );
1 row created.
现在根据这个表运行一个查询:查找满足x='a',y=1的行。
SQL> select * from t where x = 'a' and
y = 1;
ERROR:
ORA-01722: invalid number
no rows selected(错误,无效的数字,没有选择任何行)
呦,没有成功。在这种情况下,数据库首先执行Y=1,当找到Y='X'的行后,很显然,它不能将'X'转换为一个数字,所以失败了。而下面的程序将给出不同的结果:
SQL> analyze table t compute statistics;
Table analyzed.(表已经分析过)
SQL> select * from t where x = 'a' and
y = 1;
X Y
- -
a 1
使用不同的优化器模式,成功了!为什么?优化器说:“嘿,检查x= 'a'要比检查y=1来得快,因为在y=1中有一个将y从字符变为数字的转换。所以,我先检查x= 'a',然后再检查y=1。”
这个例子说明谓词执行的次序可能是不确定的,你不能指望有一种特定的执行次序。也就是说,当你依靠一个隐含的转换时,必须非常谨慎。
68、显示SGA--fixed size(固定大小)与variable size(可变大小)。
当在svrmgr提示符下运行 “show SGA”时,fixed size和variable size是什么意思?
答:fixed size就是SGA中固定组件(它在编译oracle 数据库本身时就固定于其中)的大小。它是固定大小的内存,用来指向SGA的其它部分。SGA这一部分的大小是不能改变的。
variable size指分配的内存块大小可变。SGA的可变块,分为共享池、大池、JAVA池、游标区和其他结构。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

weixin_33859231

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值