Questions tagged «oracle-11g-r2»

Oracle Database 11g第2版。也请标记oracle以进行搜索。

14
消除ListAgg(Oracle)中的重复项
在Oracle 11.2之前,我使用自定义聚合函数将一列连接成一行。11.2添加了该LISTAGG功能,因此我尝试使用该功能。我的问题是我需要消除结果中的重复项,而且似乎无法做到这一点。 这是一个例子。 CREATE TABLE ListAggTest AS ( SELECT rownum Num1, DECODE(rownum,1,'2',to_char(rownum)) Num2 FROM dual CONNECT BY rownum<=6 ); SELECT * FROM ListAggTest; NUM1 NUM2 ---------- --------------------- 1 2 2 2 << Duplicate 2 3 3 4 4 5 5 6 6 我想看的是: NUM1 NUM2S ---------- -------------------- 1 2-3-4-5-6 2 …



4
为什么OS身份验证被认为对Oracle数据库的安全性较差?
根据《Oracle数据库安全性指南》,Oracle将弃用OS身份验证 请注意,REMOTE_OS_AUTHENT参数在Oracle Database 11g第1版(11.1)中已弃用,并且保留该参数仅是为了向后兼容。 此外,大多数安全信息和工具都将 OS(外部)身份验证视为安全问题。我试图理解为什么会这样。我看到了操作系统身份验证的一些优点: 如果没有OS身份验证,则应用程序必须将密码存储在各种应用程序中,每个应用程序都具有自己的安全模型和漏洞。 域身份验证已经必须是安全的,因为如果不是这样,则数据库安全性只会减慢对数据库的访问,但不能阻止它。 与必须创建一个更安全的域密码的用户相比,创建一个更安全的域密码的用户可以创建的安全性更高,因为必须连接的不同数据库的数量会增加。


3
Oracle没有为长键使用唯一索引
我的测试数据库中有一个包含25万行的表。(有几亿个产品正在生产,我们在那里也可以观察到相同的问题。)该表具有nvarchar2(50)字符串标识符(不是null),并且具有唯一索引(不是PK)。 标识符由第一部分组成,该部分在我的测试数据库中具有8个不同的值(在生产中大约有1000个),然后是@符号,最后是一个1到6位数字的数字。例如,可能有5万行以“ ABCD_BGX1741F_2006_13_20110808.xml @”开头,然后是5万个不同的数字。 当我根据其标识符查询单行时,基数估计为1,成本非常低,可以正常工作。当我在一个IN表达式或一个OR表达式中查询带有多个标识符的多行时,索引的估计是完全错误的,因此使用了全表扫描。如果我用一个索引强加索引,它会非常快,实际上全表扫描的执行速度要慢一个数量级(并且生产速度要慢得多)。因此,这是一个优化程序问题。 作为测试,我使用完全相同的DDL和完全相同的内容复制了该表(在相同的模式+表空间中)。我在第一个表上重新创建了唯一索引以取得良好效果,并在克隆表上创建了完全相同的索引。我做了一个DBMS_STATS.GATHER_SCHEMA_STATS('schemaname',estimate_percent=>100,cascade=>true);。您甚至可以看到索引名称是连续的。因此,现在两个表之间的唯一区别是,第一个表是在很长一段时间内以随机顺序加载的,块分散在磁盘上(与其他几个大表一起放在一个表空间中),第二个表是成批加载的插入选择。除此之外,我无法想象任何区别。(自上次大删除以来,原始表已缩小,此后没有一个删除。) 这是病假表和克隆表的查询计划(黑色笔刷下的字符串在图片中相同,灰色笔刷下的字符串也一样): (在此示例中,有1867行以黑色刷过的标识符开头。2行查询产生的基数为1867 * 2,3行查询产生的基数为1867 * 3,依此类推。巧合的是,Oracle似乎并不在乎标识符的结尾。) 什么可能导致此行为?显然,在生产中重新创建表将非常昂贵。 USER_TABLES:http : //i.stack.imgur.com/nDWze.jpg USER_INDEXES:http : //i.stack.imgur.com/DG9um.jpg 我只更改了架构和表空间名称。您可以看到表名和索引名与查询计划屏幕快照上的相同。

3
如何区分SQL和PL / SQL?
我知道这个问题听起来太愚蠢了,但是我从不理解这部分。 SQL * Plus可与SQL和PL / SQL一起使用。我怎么知道某些代码是SQL还是PL / SQL?如果我的代码具有for循环,那么它不再是SQL吗? PL / SQL是SQL的扩展,使其具有循环,条件等。那么默认情况下,任何SQL代码是PL / SQL代码吗?是不是 SQL和PL / SQL之间是否有界线? 触发该问题的区分黑白SQL和PL / SQL的两个示例: 这两个create table语句有什么区别? /programming/2267386/oracle-11g-varray-of-objects/2267813#2267813

4
SQL * Plus命令末尾的分号的意义是什么?
有些语句(例如create table,insert into等)最后以分号表示: CREATE TABLE employees_demo ( employee_id NUMBER(6) , first_name VARCHAR2(20) , last_name VARCHAR2(25) CONSTRAINT emp_last_name_nn_demo NOT NULL ) ; 而其他人喜欢 set echo on connect system/manager 也不要使用分号。 这背后的原因是什么?我如何决定自己将分号放在哪里?

2
“ ORA-01950:对表空间'SYSTEM'没有权限”:这是什么错误?
之前我创建了一个用户: SQL>create user suhail identified by password SQL>User created. SQL>Grant create session,create table to suhail; SQL>Grant Succeeded. 但是当我登录为suhail并尝试创建一个时table,出现错误提示ORA-01950: no privileges on tablespace 'SYSTEM'。这是什么错误?为什么会发生? SQL> connect suhail Enter password: Connected. SQL> create table suhail_table(name char(10)); create table suhail_table(name char(10)) * ERROR at line 1: ORA-01950: no privileges on tablespace 'SYSTEM' 我正在使用Oracle …

4
使用包含空格,分号和正斜杠的SQLPlus执行脚本
有时候,我会获得一个脚本,该脚本可以在SQL Developer或Toad中正常运行,但是需要修改才能从SQL * Plus成功运行。这是最坏的情况示例,其中包含多个带有空行,分号和正斜杠的语句: INSERT INTO t1 VALUES ('a ; / '); INSERT INTO t1 VALUES ('b ; / '); DELETE FROM t1 WHERE c1 = 'c ; / '; 由于各种原因,这些语句需要从SQL * Plus运行。用简单的...即可轻松解决空白行。 set sqlblanklines on 我知道sqlterminator可以更改和/或关闭它们,但是两者都需要修改代码,前者在不解决问题的情况下解决了问题,也没有解决嵌入式斜杠问题。 最好的答案是一种通过以某种方式更改环境(如sqlblanklines所做的那样)而无需修改即可运行这些语句的方法。如果这不可能,那么也许可以通过编程方式修改脚本。我正在尝试避免手动更改。

2
如何释放磁盘空间?哪些日志/目录要清除?
我想释放Linux机器上的磁盘空间。我仔细研究了空间使用情况,发现以下目录的大小很大 /u01/app/11.2.0/grid/cv/log /u01/app/11.2.0/grid/log/diag/tnslsnr/r1n1/listener_scan2/alert (Contains xml files) /u01/app/11.2.0/grid/rdbms/audit(Contains .aud files) /home/oracle/oradiag_oracle/diag/clients/user_oracle/host_XXXXXXXXXX/alert(Contains xml files) /u01/app/oracle/diag/rdbms/crimesys/crimesys1/alert (Contains xml files) 我可以从这些目录中删除内容吗?注意:我的意思是内容而不是目录。

2
将架构导入新的或不同的表空间
是否有一种简便的方法可以使用一个新的或不同于数据来源的表空间将模式导入Oracle 11gR2? 例如,我已经从OLDDB导出了BLOG_DATA,所有用户数据都存储在USERS表空间中。 在NEWDB上,我想导入BLOG_DATA模式,但是将用户对象存储在专门为此用户创建的BLOG_DATA表空间中。 我已经创建了BLOG_DATA用户,创建了BLOG_DATA表空间,并将其设置为该用户的默认表空间,并添加了适当的无限配额。 CREATE TABLESPACE blog_data DATAFILE SIZE 1G; CREATE USER blog_data IDENTIFIED BY secretpassword DEFAULT TABLESPACE blog_data QUOTA UNLIMITED ON blog_data; GRANT connect,resource TO blog_data 该模式是从OLDDB导出的,类似于 exp blog_data/secretpassword@OLDDB file=blog_data.dmp 在阅读了Phil的出色回答后,我发现自己很纳闷: 由于数据除了默认表空间(用户拥有配额的唯一表空间)外别无其他地方,这是否会有效地迫使imp将所有用户对象放在该默认表空间中? imp blog_data/secretpassword@NEWDB file=blog_data.dmp 然后,这会将整个blog_data模式放在NEWDB的blog_data表空间中吗?有什么原因为什么这行不通或者我会遇到某些对象等问题? 更新: 我进行了快速测试,发现情况确实如此。Imp将对象放置在该用户的默认表空间中,前提是该对象不能将其放置在原始表空间中(例如,该表空间不存在)。完整说明:http : //www.dolicapax.org/? p= 57 不过,我认为像Phil那样使用Data Pump可能是首选。

2
在Oracle中进行PL / SQL工作的应用程序开发人员的安全性
您如何处理Oracle中缺少架构级别特权的问题?Oracle的安全体系结构适用于只需要对象级特权的应用程序,并且适用于几乎不需要限制的DBA。但是,对于使用前端应用程序和多种模式的PL / SQL进行开发的程序员而言,体系结构中似乎存在很大的漏洞。这是我的一些缺点: 使每个程序员都按照自己的模式进行开发。DBA将向需要它们的程序员授予对象级别的特权。任何软件包开发都必须由DBA完成。主要缺点是程序员会像使用存储桶一样使用数据库,从而损害数据库性能。我希望程序员在数据库中进行开发,但是这种方法会大大不利于它。 为每个程序员提供他们需要进行开发的十几种模式的用户名/密码。向这些应用程序模式授予创建过程,表等的权限。这种方法的一些缺点是程序员必须维护多个登录名,并且必须很少自己登录。跨模式开发也很困难。 向程序员授予开发所需的每个模式的代理身份验证特权。这使他们可以自己登录,而不必授予他们代理权限以外的其他权限。缺点包括程序员必须为其代理的每个模式维护独立的连接,跨模式开发更加麻烦,因为连接必须不断更改,并且使用带有已通过身份验证的公共数据库链接的程序包无法在代理连接内部进行编译。 给每个程序员DBA特权。–这里的缺点是安全性。不能将任何模式程序员挡在任何模式之外,并且任何程序员都可以模仿任何其他程序员(DBA)。 似乎缺少一个选项来授予每个程序员SELECT / INSERT / CREATE / etc。他们需要在其中进行开发的模式具有特权。他们使用一个连接以自己的身份登录以完成工作。他们有权访问的架构中的新对象将立即可用。 我想念什么吗?您如何处理进行PL / SQL开发的应用程序程序员?

1
Oracle数据库中的提交与快速提交与提交清除
我想知道是否有人可以验证我对这三个术语与Oracle数据库之间的区别的理解。 许多消息来源混淆了这些术语,并且没有详细解释它们,因此查找信息有些困难。 从我的收集: 提交和快速提交是完全一样的东西,所有提交都是快速提交。 快速提交实质上仅更新撤消/回滚段头的事务表中的标志,以指示事务已提交。但是,实际块未重新访问,这意味着位于数据块头中的感兴趣的事务列表(ITL)中的撤消字节地址(UBA)仍指向相应撤消段的事务表。此外,不释放相应行的锁定字节,并且ITL中的锁定计数不变(行仍被锁定)。 在提交清除中,将重新访问该块,并使用提交SCN更新ITL。但是,ITL中的锁计数和每行存储的锁字节仍未更新(行仍然像快速提交中一样被锁),即使更改了块也不会生成重做。 正常提交(==快速提交)的块将在下次触摸(并生成重做)时进行延迟块清除。 进行了提交清除的块将在下次被触摸(并生成重做)时进行延迟日志记录块清除。 希望有人可以验证这些观点!谢谢!

2
LNNVL证明
LNNVL是一个Oracle内置函数,对于评估为FALSE或UNKNOWN的条件返回TRUE,对于评估为TRUE的条件返回FALSE。我的问题是,返回真值条件的对立而不只是处理NULL值有什么好处? 例如,假设您有一个包含StartCommission和CurrentCommission列的Emp表,其中的列可能包含空值。以下仅返回两个都不为null的行: SELECT * FROM Emp WHERE StartCommission = CurrentCommission; 如果要包括其中任一佣金为null的行,则可以执行以下操作: SELECT * FROM Emp WHERE StartCommission = CurrentCommission OR StartCommission IS NULL OR CurrentCommission IS NULL; 似乎存在一个可以缩短此语法的函数,但是使用LNNVL会返回所有非相等记录以及所有具有空值的记录。 SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission); 向其添加NOT只会返回不包含null的行。在我看来,这种情况下所需的功能是保持真实条件为真,错误条件为假以及未知条件为真。我真的在这里创建了一个低用例吗?是否真的更有可能想要将未知变成真实,将真实变成虚假,以及将虚假变成真实? create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2)); insert into emp values (null,null); insert …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.