Google

星期五, 五月 09, 2008

轻松六步使你的Oracle存储过程迅速加密

本文教你轻松六步法让你的Oracle存储过程迅速加密。
软件环境: 1、操作系统:windows 2000 Server。 2、数 据 库:Oracle 8i R2 (8.1.7) for NT 企业版。 3、安装路径:C:\Oracle。 实现方法: 1、
  D:\>set NLS_LANG=AMERICAN_AMERICA.USACII7 或 D:\>set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 或 D:\>set NLS_LANG=CHINESE_CHINA.ZHS16GBK D:\>set

直接打set命令可以查看环境变量。 2、在D:\下创建a.sql文件,内容如下:
create or replace procedure test1(i in number) as begin dbms_output.put_line('输入参数是'to_char(i)); end;

3、
D:\>wrap iname=a.sql PL/SQL Wrapper: Release 8.1.7.0.0 - ProdUCtion on Tue Nov 27 22:26:48 2001 Copyright (c) Oracle Corporation 1993, 2000.All Rights Reserved. Processing a.sql to a.plb

4、运行a.plb“SQL> @d:\a.plb”过程已创建。 5、运行存储过程:
SQL> set serveroutput on SQL> execute test1(1);


输入参数是1,PL/SQL 过程已成功完成。 6、查看存储过程的代码:
SQL> select name,text from all_source where type='PROCEDURE' and name='TEST1';

结果:看不到其原码。

http://database.csdn.net/page/52ff043f-91fe-42c2-b65d-7e1833b3a218

标签: ,

星期五, 四月 18, 2008

Oracle与SQL Server的“相对论”

本文的作者Sean McCown是一位资深的数据库工作者,在数据库行业摸爬滚打15年了。目前的工作是解答数据库相关的评论。以下是Sean McCown在解答评论过程中所感所悟。

  Sean McCown发表在博客中的内容如下:

  我实在对社区里的有些评论不敢苟同(有的评论的水平很差),更多的是希望快速回答,完成工作。

  我首先要说的是一件令我非常烦恼的事情。我已经在数据库行业摸爬滚打15年了。虽说不是对数据库的所有的知识都一清二楚,但是我对某些知识还是 数一数二的。因此,你们不要一而再,再而三的提醒我,“SQL”和“SQL Server”之间是有区别的。你想说的区别我已经略知一二了。诚然在网上post很长的文章的时候,最好还是能够让你的听众清楚的明白你在说什么。当我 谈到Oracle 和 SQL Server的时候,我应该可以将SQL Server简写为SQL,不用每次都写出它的全部拼写。如果有时候让你感到困惑,我对此深表歉意,但是以后你应该记住,很好的理解我所指的对象。很清楚,我不是在谈论SQL语言。甚至有一个家伙说过我应该写Microsoft SQL Server。这样诚然不错……但是,当我说到Oracle的时候,我也没有看到你们有谁感到迷惑。Oracle是一个公司的名字。他们生产了很多的产品。为什么没有人通过Email告诉我我应该称之为Oracle Database 11g呢?

  我想你们已经知道了我缩写所指吧,不用每次都写全称吧。好了,这就是我在进入正题前所要讲的,真是一吐为快啊。

  现在进入正题。你们当中有一些人给出了非常清楚、明晰、深思熟虑的评论。而其他人一些人没有说出实质性的内容,还进行漫骂。这也没有关系,我不会对后者做过多的关注。

  其中非常优秀的评论来自从事Oracle工作的人士。这就不奇怪他们写的评论很有深度。他们是一群非常聪明的群体,他们能够证明自己的观点正确,而不是漫骂。

  下面一幕是我又觉非常有意思的。如果我们在MS(微软公司的简称)平台上布置一项任务,我们就很有可能得到差不多的解决方案,这个现象得到了很 多人的同意,他们也是这么认为的。如果我们在Oracle平台上布置与MS(微软公司的简称)平台相同的任务的话,很难找到答案。并不是说这里没有该任务 的解决方案,只是不像MS平台下那么容易得到而已。

  也许有许多人认为这只是我的一家之言,因为他们在Oracle Database 9i/10g/11g上从来没有遇到寻求帮助的麻烦。也许我们都是对的。这取决于你的经历了。事实上,我身边有一群IT工作者,在自己的blog上post自己所遇到的麻烦,他们中大多数同意我的观点。这些人大多都是一些杂货店的数据库管理员。

  但是,我想要声明的是虽然有许多人不承认Oracle数据库学习资源很难找到,但是事实上就是如此,MS学习资源就是更加容易获得。

  有人或许就要问我,为什么我不去OTN(Oracle 技术网)那里呆着。事实上,我就在那里,但是,伙计,你要知道的是,我已经厌倦了坐在电脑前面,要挑选如此多的网页找到需要回答的问题。如果坐下来观看视 频的话,岂不是一件愉快的事情。我个人觉得视频资源更好。因此我喜欢视频培训。但是问题来了,几乎没有提供商来做Oracle新产品(Oracle Database 9i/10g/11g)的视频培训。事实上,到目前为止,我还不知道有任何的公司在做Oracle培训。

  拿AppDev举例子来说。他们有非常棒的培训,但是他们只是做MS公司的产品。甚至其它做视频培训的提供商对Oracle也择道而行。这是什 么原因了?这就是我一开始讨论的关键所在。难道是没有人用Oracle?我们知道这肯定是不正确的。难道是Oracle数据库管理员天生就知道 Oracle所有的知识?当让也不是。难道是由于Oracle社区的存在使得培训提供商选择离开Oracle这个产品?事实上Oracle也没有生产出比 提供商更好的培训教程。

  难道主要原因是Oracle大多用在Unix/Linux操作系统上, 因此Oracle的技术人员更加喜欢读文档而不是观看视频?这对吗?这些Oracle的技术人员都是用的命令行操作,因此不能忍受使用图形界面的软件,即 使是学习这样的事情?的确,这已经成为一种习惯,或者说是一种氛围。这个发现是从Oracle社区里找到的。另外,你所需要的相关信息在Oracle社区 里并不是没有,而是不容易发现而已。

  就拿这次我安装Data Guard的经历来说,我需要OBE(oracle示例系列)。问题是那些OBE(oracle示例系列)是在Linux环 境下使用的,而我需要的是在Windows下使用的。官方网站上的一些链接并不是跳转的很合理,如果有微小的错误存在,更本就不会有任何提示让你后退到原 来的路径。另外,有一些阅读信息必须严格执行,而一些则就很随便了,OBE(oracle示例系列)并没有给你任何引导,那种OBE(oracle示例系 列)对应哪个平台。最后,我好不容易找到了一个是适合Windows的。但是,并不是很好。因此,你也不要问我如何完成OBE(oracle示例系列)。 回过头来,该想想为什么没有对Oracle培训的一种需求,形式内容更加丰富的需求呢?

  仍然还有一些人说我很愚蠢,因为Oracle比SQL更加容易做技术支持。

  在这里我也不想找更多的例子了。只需要比较如何备份Oracle和备份SQL就知道谁的资料好找。

  另外我还要给出管理表空间(tablespace) 的例子,说到这里,肯定有人说管理表空间(tablespace)太easy了,因为他们一直就是在干这种事情,一条简单的命令就ok了。是的,对这些人 来说很简单,正好证明了我说的观点:孰能生巧。在SQL数据库中,我不用去管理表空间(tablespace)(或者文件组filegroups),因为 它们是自动增长的。唯一一次我需要管理文件组filegroups是由于我设定了增长范围,而后来增长溢出了,或者我磁盘空间不够了。在Oracle中, 如果我将块大小(Block Size)设置错误的话,那么结果就只能变得很大,我必须去管理它,因为那些表格将会比我想象的还要大。现在在11g有一个bigfile参数,最近才有的。

  数据库平台已经很明显在人们心目中形成了各自的印象,不管MS采取什么样的措施,他们不会改变些那些觉得MS是三流产品的人的看法。这已经是一 个事实了。至于说那个更好,就主要取决于你拿他们做什么了。我发现SQL更加容易组织,运行和构建应用程序。对于普通人来说,Oracle太复杂了,不但 是看看一本书,一个CD就能上手的。

  但是,但你看Oracle的 Data Guard时,它就比SQL反射法要先进很多了。

  好了,已经写了足够多了。至少我觉得是很多了。需要声明的是,我并不是说Oracle平台的坏话。但是,对于用户来说,它的确不太容易掌握。

http://news.csdn.net/n/20080417/115263.html

标签: ,

星期一, 四月 07, 2008

Oracle/MS SQL Server的数据库多表关联更新UPDATE与多表更新

一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新。而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。我们先来讨论根据其他表数据更新你要更新的表


一、MS SQL Server 多表关联更新

sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式 中引用要更新的表以外的其它数据。
一般形式:

update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHERE 逻辑表达式

例如:

UPDATE dbo.Table2
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
FROM dbo.Table2
INNER JOIN dbo.Table1
ON (dbo.Table2.ColA = dbo.Table1.ColA);

实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的

二、Oracle 多表关联更新

Oracle没有update from语法,可以通过两种实现方式:

1、利用子查询:
update A
SET 字段1=(select 字段表达式 from B WHERE ...),
字段2=(select 字段表达式 from B WHERE ...)
WHERE 逻辑表达式

UPDATE多个字段两种写法:


写法一:

UPDATE table_1 a
SET col_x1 = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m),
col_x2 = (SELECT b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m)
WHERE EXISTS (SELECT * FROM table_2 b WHERE b.col_n = a.col_m)



UPDATE table_1 a
SET col_x1 = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m),
col_x2 = (SELECT b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m)
WHERE a.col_m=(SELECT b.col_n FROM table_2 b WHERE b.col_n = a.col_m)


写法二:

UPDATE table_1 a
SET (col_x1, col_x2) = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m)
WHERE EXISTS (SELECT * FROM table_2 b WHERE b.col_n = a.col_m);



UPDATE table_1 a
SET (col_x1, col_x2) = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m)
WHERE a.col_m=(SELECT b.col_n FROM table_2 b WHERE b.col_n = a.col_m)

注意:

1. 对于子查询的值只能是一个唯一值,不能是多值。
2. 子查询在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。且where EXISTS子句可用另一方法代替,如上。

2、利用视图:

UPDATE (SELECT A.NAME ANAME,B.NAME BNAME FROM A,B WHERE A.ID=B.ID)
SET ANAME=BNAME;

注意:

1. 对于视图更新的限制:
如果视图基于多个表的连接,那么用户更新(update)视图记录的能力将受到限制。除非update只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。


另外,Oracle中的Delete的from子句也没有多表联接的功能,只能通过子查询的方式来做:
delete from 表A where exists (select * from 表B where 表A.empid=表B.empid)
delete from 表A where 表A.empid in (select empid from 表B)

三、oracle视图多表更新

在oracle中通常如果视图的数据源来自单表则该视图可以进行更新。而如果视图数据源来自两个以上表时这个视图是不可更新的。但有时候为了操作的方便我们更希望能够对多表视图也进行更新。

这时候我们可以通过建立更新触发器来替代该视图原有更新以达到多表更新的效果

例如:

3.1 创建测试数据表
--===================================================
--创建测试表
--===================================================
Drop Table t1;
Drop Table t2;
create table t1
( t11 numeric(28),t12 varchar2(20));
create table t2
( t11 numeric(28),t22 varchar2(20));

3.2 多表视图范例
--===================================================
--创建测试视图
--===================================================
create Or Replace view t as
select T1.t11 f1 ,T1.t12 f2 ,T2.t22 f3
from T1,T2
Where T1.t11=T2.t11;

3.3 多表视图触发器范例
--===================================================
--创建视图的替代触发器
--===================================================
Create Or Replace Trigger Trg_InsUpdDel_t
Instead Of Insert or update or delete
on t
for each row
Declare
begin
If Inserting Then
Insert Into t1 (t11,t12) Values (:New.f1,:New.f2);
Insert Into t2 (t11,t22) Values (:New.f1,:New.f3);
elsif Updating Then
Update t1 set t11=:New.f1,t12=:New.f2 where t11=:New.f1;
Update t2 set t11=:New.f1,t22=:New.f3 where t11=:New.f1;
elsif Deleting then
Delete from t1 where t11=:Old.f1;
Delete from t2 where t11=:Old.f1;
End if;
end;
如此即实现多表可更新视图的定义工作 。

但要注意当视图进行重新编译的时候这个触发器会失效需要重建。


http://hi.baidu.com/suofang/blog/item/249c067b40c8def00ad187aa.html

标签: , ,

星期三, 四月 11, 2007

原始即是力量(2)

今天看DB2的书,发现与Oracle一样,很多数据库性能方面的东东很原始。原始到你自己要估算表可能的大小,常用的表,索引的大小,自己指定设备,等等。而且Microsoft SQL Server好用是好用了一点,简单是简单了一点,可惜的是这种定制能力差了不少。
原始,是一种力量。

标签: , , ,

辽ICP备05003652号
流风洄雪听天籁,轻云蔽日看落花

Powered by Blogger