MySql5.0以后均支持存储过程,最近有空,研究了一把这个。
格式:
MySql5.0以后均支持存储过程,最近有空,研究了一把这个。
格式:
1.1 谁能连接,从那儿连接?
你可以允许一个用户从特定的或一系列主机连接。有一个极端,如果你知道降职从一个主机连接,你可以将权限局限于单个主机:
GRANT ALL ON samp_db.* TO boris@localhost IDENTIFIED BY "ruby"GRANT ALL ON samp_db.* TO fred@res.mars.com IDENTIFIED BY "quartz"
(samp_db.*意思是“samp_db数据库的所有表)另一个极端是,你可能有一个经常旅行并需要能从世界各地的主机连接的用户max。在这种情况下,你可以允许他无论从哪里连接:
GRANT ALL ON samp_db.* TO max@% IDENTIFIED BY "diamond"
“%”字符起通配符作用,与LIKE模式匹配的含义相同。在上述语句中,它意味着“任何主机”。所以max和max@%等价。这是建立用户最简单的方法,但也是最不安全的。
取其中,你可以允许一个用户从一个受限的主机集合访问。例如,要允许mary从snake.net域的任何主机连接,用一个%.snake.net主机指定符:
GRANT ALL ON samp_db.* TO mary@.snake.net IDENTIFIED BY "quartz";
如果你喜欢,用户标识符的主机部分可以用IP地址而不是一个主机名来给定。你可以指定一个IP地址或一个包含模式字符的地址,而且,从MySQL 3.23,你还可以指定具有指出用于网络号的位数的网络掩码的IP号:
MySQL管理员应该知道如何设置MySQL用户账号,指出哪个用户可以连接服务器,从哪里连接,连接后能做什么。MySQL 3.22.11开始引入两条语句使得这项工作更容易做:GRANT语句创建MySQL用户并指定其权限,而REVOKE语句删除权限。两条语句扮演了mysql数据库的前端角色,并提供与直接操作这些表的内容不同的另一种方法。CREATE和REVOKE语句影响4个表:授权表
内容
user 能连接服务器的用户以及他们拥有的任何全局权限
db 数据库级权限
tables_priv 表级权限
columns_priv 列级权限
还有第5个授权表(host),但它不受GRANT和REVOKE的影响。
当你对一个用户发出一条GRANT语句时,在user表中为该用户创建一条记录。如果语句指定任何全局权限(管理权限或适用于所有数据库的权限),这些也记录在user表中。如果你指定数据库、表和列级权限,他们被分别记录在db、tables_priv和columns_priv表中。
用GRANT和REVOKE比直接修改授权表更容易些,然而,建议你阅读一下《MySQL安全性指南》。这些表异常重要,而且作为一名管理员,你应该理解它们如何超越GRANT和REVOKE语句的功能水平。
在下面的章节中,我们将介绍如何设置MySQL用户账号并授权。我们也涉及如何撤权和从授权表中删除用户。
你可能也想考虑使用mysqlAccess和mysql_setpermission脚本,它是MySQL分发的一部分,它们是Perl脚本,提供GRANT语句的另一种选择设置用户账号。mysql_setpermission需要安装DBI支持。
1、 创建用户并授权
GRANT语句的语法看上去像这样:
GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION
要使用该语句,你需要填写下列部分:
privileges
授予用户的权限,下表列出可用于GRANT语句的权限指定符:
权限指定符
近日SAP的开发者修正了一个存在SAP MaxDB数据库中的严重漏洞,该漏洞可以被黑客利用来执行恶意代码。
来自赛门铁克的研究人员Olive Karow发现了这个数据库漏洞。该漏洞在最新版本MaxDB 7.6.00.31中被修补。
根据赛门铁克发布的报告,“通过发送一个变形的HTTP请求,攻击者可以获得wahttp进程的权限,从而执行恶意代码。不需要认证就可以成功的利用该漏洞。”
根据赛门铁克的报告,有一个临时性的解决办法,MaxDB客户可以禁用SAP-DB的WWW服务或控制其访问权限。SAP客户可以从www.service.sap.com下载最新版的数据库。
在2004年,SAP与开源数据库MySQL达成了一个协议,可以对SAP DB专利共享,随后该数据库更名为MaxDB。MaxDB被进行了最优化,以与mySAP商务套件和MySQL数据库管理系统配合运行。
原文链接:http://searchsap.techtarget.com/originalContent/0,289142,sid21_gci1213576,00.html
(t114)
问:
MySQL已经通过免费和开源的特性已经慢慢的占领市场,MySQL崛起的过程中Oracle,DB2等都采取了部分代码开源的崛起,我想知道MySQL面对市场竞争对手的方案,MySQL会采取怎样的措施?
David Axmark:
开源和免费是两个完全不同的概念,免费并不是真正的开源,这是最大的区别。我们虽然是免费的但是没有开源,所谓开源是所有的代码都公开了,我们只是编好的你可以用。
我所知道其他专有数据库的开源项目,往往是公司内部已经“死”掉的项目,而且客户也没有需求,所以就开源了。比如(IN??)就是用户越来越少,然后就开源了。
问:
这样说的话是不是因为这些公司用开源满足客户的需求,单方面最终目标是赚钱,MySQL为什么要开源?MySQL的最终目标是不是为了赚钱?
David Axmark:
我们一直就是盈利,只不过增长投资以后要拓展,拓展以后有点亏钱,但是我们随时可以变得盈利。任何一家公司存在本身就都是要赚钱的,不光是开源的还是怎么样。但是我们赚的钱要比一般的软件公司赚的少很多,尽管是这样我们发展的还是很快的。
问:
是不是可以理解为这是“薄利多销”的特点,就是挣的钱很少,但是是迅速的占领市场份额。您刚才演讲的时候说到现在排名前面的还有两个,一个是 SQL Server,一个是Oracle,面对这两个强大的竞争对手,MySQL自己最大的核心竞争力是什么?
David Axmark:
让我们看吧。
问:
我想请问一下周先生,刚才演讲的时候也有人讲到中国人对开源不很理解,周先生是致力于开源事业的,您对这个问题怎么看?
周群:
我觉得中国市场和国外市场有所区别。我经常开一些开源论坛的会,包括SUN的,会上大家讨论的时候外国专家和中国专家,中国专家愿意谈跟Windows兼容性的问题,外国专家认为不应该花精力在微软这个事上的,因为要兼容的话不断的跟微软走。微软随时说随便找一个东西都可以不兼容,所以他们集体的对中国的开源界有一些争论。有些开源专家认为中国这么多的用户,我们还是要把兼容性解决。我们中国有很好的开源精神领袖,他在会上发言说,因为他参与了世界开源的讨论,所以他也说中国怎么跟国外配合发展开源系统,而不是中国自己关起门来。当中国的专家提跟Windows兼容的时候遇到这样那样的难题,就是应该没有人支持你,拿到国际上也没有上给你钱。
问:
我想问一下David Axmark先生,目前在全球购买MySQL数据库的用户大概占到什么样的比例?第二个问题分别请两位讲进目前GPL第三版本出来以后业界对数字版权方面是什么态度,SQL是否会支持?
David Axmark:
确实不知道有多少比例,我估计是1000:1。我不知道的原因是我不看重有多少商业用户。GPL3更简洁,而且更国际化了,GPL3在数据库方面取得了很多法律方面的保护,但是在数字版权方面具体的细节大家还是有争议的。数字版权确实有这样那样的争议,主要争议是有多少允许免费用?这个争议我认为很快还是可以解决的。
问:
我想问一下许可协议的问题,商业版的最新的正在研发中的MySQL5.0的版本,MySQL新的版本采取什么样的协议,在收费上有什么样的计划?
David Axmark:
2001年到现在MySQL的各种版本已经面市,5.0已经宣布,现在是5.1颁布。
问:
红帽公司提出一种服务方式,就是服务即软件的说法,我想知道MySQL在服务模式上有什么样的看法?是否同意这样的说法还是有自己另外的服务模式?我们今天研发中心成立对于中国MySQL用户来说无疑是天大的好消息,我们进入中国的过程中有没有针对中国的用户,社区以及中国的MySQL企业级用户有怎样的服务计划?
David Axmark:
完全同意红帽的概念,在中国我们和全球的MySQL用户都一样,可以享受订阅和服务。MySQL是开源的,它区别是的个人用户要从社区上下载自己维护,企业级用户要购买商业版才能得到一定的服务。
问:
MySQL数据库以目前主流数据库在兼容度上怎么样?我所关心的问题是我们企业大部分的应用都开发在其他的主流数据上,能部分平滑的过渡过来?第二个问题,请问MySQL的开发工具目前是采用自己的开发工具还是第三方的开发工具,有没有汉化版?
David Axmark:
迁移主要看用户的应用,在很多事例中有的迁移非常容易,有的迁移就非常难,关键看您的应用。现在大型数据库功能非常全,但是要看性能可靠性和易用性。我们自己有开发工具,也支持结合MySQL的第三方的开发工具,第三方开发工具可能是有汉化的。
MySQL 数据表的字段必须有定义一个数据类型。这有大约 25 种选择,大部分都是直接明了的,就不多费口舌了。但有几个有必要提一下。
TEXT
TEXT 不是一种数据类型,虽然可能有些书上是这么说的。它实际上应该是“ LONG VARCHAR ”或者“ MEDIUMTEXT ”。
DATE
DATE 数据类型的格式是 YYYY-MM-DD ,比如: 1999-12-08 。你可以很容易的用 date 函数来得到这种格式的当前系统时间:
date("Y-m-d")
并且,在 DATA 数据类型之间可以作减法,得到相差的时间天数:
$age = ($current_date - $birthdate);
SET
集合 SET 是一个有用的数据类型,它和枚举 ENUM 有点相似,只不过是 SET 能够保存多个值而 ENUM 只能保存一个值而已。而且, SET 类型最多只能够有 64 个预定的值,而 ENUM 类型却能够处理最多 65,535 个预定义的值。而如果需要有大于 64 个值的集合,该怎么办呢?这时就需要定义多个集合来一起解决这个问题了。
通配符
SQL 的同配符有两种:“ * ”和“ % ”。分别用在不同的情况下。例如:如果你想看到数据库的所有内容,可以像这样来查询:
SELECT * FROM dbname
WHERE USER_ID LIKE '%';
这儿,两个通配符都被用上了。他们表示相同的意思 ?? 都是用来匹配任何的字符串,但是他们用在不同的上下文中。“ * ”用来匹配字段名,而“ % ”用来匹配字段值。另外一个不容易引起注意的地方是“ % ”通配符需要和 LIKE 关键字一起使用。
还有一个通配符,就是下划线“ _ ”,它代表的意思和上面不同,是用来匹配任何单个的字符的。
(T115)
受影响系统:
MySQL AB MySQL <= 5.1.10
描述:
MySQL是一款使用非常广泛的开放源代码关系数据库系统,拥有各种平台的运行版本。
在MySQL上,拥有访问权限但无创建权限的用户可以创建与所访问数据库仅有名称字母大小写区别的新数据库。成功利用这个漏洞要求运行MySQL的文件系统支持区分大小写的文件名。
此外,由于在错误的安全环境中计算了suid例程的参数,攻击者可以通过存储的例程以例程定义者的权限执行任意DML语句。成功攻击要求用户对所存储例程拥有EXECUTE权限。
厂商补丁:
MySQL AB
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://lists.mysql.com/commits/5927
http://lists.mysql.com/commits/9122
(t114)
今天刚刚看到,没有测试性能。
SELECT *
FROM (select ROW_NUMBER() Over(order by CreditCardID) as rowNum, *
from Sales.CreditCard) as table
where rowNum> 0 and rowNum<50
4.查询数据的最大排序问题(只能用一条语句写)
CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0))
insert into hard values ('A','1',3)
insert into hard values ('A','2',4)
insert into hard values ('A','4',2)
insert into hard values ('A','6',9)
insert into hard values ('B','1',4)
insert into hard values ('B','2',5)
insert into hard values ('B','3',6)
insert into hard values ('C','3',4)
insert into hard values ('C','6',7)
insert into hard values ('C','2',3)
要求查询出来的结果如下:
qu co je
----------- ----------- -----
A 6 9
A 2 4
B 3 6
B 2 5
C 6 7
C 3 4
就是要按qu分组,每组中取je最大的前2位!!
而且只能用一句sql语句!!!
select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)
5.求删除重复记录的sql语句?
怎样把具有相同字段的纪录删除,只留下一条。
例如,表test里有id,name字段
如果有name相同的记录 只留下一条,其余的删除。
name的内容不定,相同的记录数不定。
有没有这样的sql语句?
==============================
10.SQL语句技巧
1、一个SQL语句的问题:行列转换
select * from v_temp
上面的视图结果如下:
user_name role_name
-------------------------
系统管理员 管理员
feng 管理员
feng 一般用户
test 一般用户
想把结果变成这样:
user_name role_name
---------------------------
系统管理员 管理员
feng 管理员,一般用户
test 一般用户
===================
create table a_test(name varchar(20),role2 varchar(20))
insert into a_test values('李','管理
1.说明:复制表(只复制结构,源表名:a 新表名:b)
SQL: select * into b from a where 1<>1
2.说明:拷贝表(拷贝数据,源表名:a 目标表名:b)
SQL: insert into b(a, b, c) select d,e,f from b;
3.说明:显示文章、提交人和最后回复时间
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
4.说明:外连接查询(表名1:a 表名2:b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUTER JOIN b ON a.a = b.c
5.说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
6.说明:两张关联表,删除主表中已经在副表中没有的信息
SQL:
delete from info where not exists ( select * from infobz where info.infid=infobz.infid )
说明:--
SQL:
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,
(SELECT NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,