数据库中有如下的数据,想取不同ID对应的日期为
最大
日期的
记录
SELECT * FROM My_
Table
A
WHERE A.LEASERENTDETAIL_ID IN(
SELECT MAX(B.LEASERENTDETAIL_ID)
FROM My_
Table
B
GROUP BY B.LEASECONTRACT_ID
,TO_CHAR(B.
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\ms
sql
7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create
table
tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create
table
tab_new like tab_old (使用旧表创建新表)
B:create
table
tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop
table
tabname
6、说明:增加一个列
Alter
table
tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter
table
tabname add primary key(col)
说明:删除主键: Alter
table
tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的
sql
语句
选择:select * from
table
1 where 范围
插入:insert into
table
1(field1,field2) values(value1,value2)
删除:delete from
table
1 where 范围
更新:update
table
1 set field1=value1 where 范围
查找:select * from
table
1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from
table
1 order by field1,field2 [desc]
总数:select count as totalcount from
table
1
求和:select sum(field1) as sumvalue from
table
1
平均:select avg(field1) as avgvalue from
table
1
最大
:select max(field1) as maxvalue from
table
1
最小:select min(field1) as minvalue from
table
1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如
TABLE
1 和
TABLE
2)并消去
表中
任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自
TABLE
1 就是来自
TABLE
2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在
TABLE
1 中但不在
TABLE
2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括
TABLE
1 和
TABLE
2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left (outer) join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL
: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right (outer) join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full/cross (outer) join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接
表中
的所有
记录
。
12、分组:Group by:
一张表,一旦分组 完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准)
在
SQL
Server中分组时:不能以text,ntext,image类型的字段作为分组依据
在selecte统计函数中的字段,不能和普通的字段放在一起;
13、对数据库进行操作:
分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接表明,附加需要完整的路径名
14.如何修改数据库的名称:
sp_renamedb 'old_name', 'new_name'
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 11(仅用于
SQl
Server)
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复
时间
select a.title,a.username,b.adddate from
table
a,(select max(adddate) adddate from
table
where
table
.title=a.title) b
6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from
table
1 where time between time1 and time2
select a,b,c, from
table
1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from
table
1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
10、说明:两张关联表,删除主
表中
已经在副
表中
没有的信息
delete from
table
1 where not exists ( select * from
table
2 where
table
1.field1=
table
2.field1 )
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒
SQL
: select * from 日程安排 where datediff('minute',f开始
时间
,getdate())>5
13、说明:一条
sql
语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
具体实现:
关于数据库分页:
declare @start int,@end int
@
sql
nvarchar(600)
set @
sql
=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’
exec sp_execute
sql
@
sql
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际
表中
的不一致(逻辑索引中的数据有可能和数据
表中
的不一致,而查询时如果处在索引则首先查询索引)
14、说明:前10条
记录
select top 10 * form
table
1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a
最大
的
记录
的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from
table
name ta where a=(select max(a) from
table
name tb where tb.b=ta.b)
16、说明:包括所有在
Table
A 中但不在
Table
B和
Table
C 中的行并消除所有重复行而派生出一个结果表
(select a from
table
A ) except (select a from
table
B) except (select a from
table
C)
17、说明:随机取出10条数据
select top 10 * from
table
name order by newid()
18、说明:随机选择
记录
select newid()
19、说明:删除重复
记录
1),delete from
table
name where id not in (select max(id) from
table
name group by col1,col2,...)
2),select distinct * into temp from
table
name
delete from
table
name
insert into
table
name select * from temp
评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
3),例如:在一个外部
表中
导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段
alter
table
table
name
--添加一个自增列
add column_b int identity(1,1)
delete from
table
name where column_b not in(
select max(column_b) from
table
name group by column1,column2,...)
alter
table
table
name drop column column_b
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U' // U代表用户
21、说明:列出表里的所有的列名
select name from syscolumns where id=object_id('
Table
Name')
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM
table
name group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23、说明:初始化表
table
1
TRUNCATE
TABLE
table
1
24、说明:选择从10到15的
记录
select top 5 * from (select top 15 * from
table
order by id asc)
table
_别名 order by id desc
1、1=1,1=2的使用,在
SQL
语句组合时用的较多
“where 1=1” 是表示选择全部 “where 1=2”全部不选,
if @strWhere !=''
begin
set @str
SQL
= 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
begin
set @str
SQL
= 'select count(*) as Total from [' + @tblName + ']'
我们可以直接写成
错误!未找到目录项。
set @str
SQL
= 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 2、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
3、压缩数据库
dbcc shrinkdatabase(dbname)
4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
5、检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
ALTER DATABASE [dvbbs] SET MULTI_USER
7、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE
table
name -- 要操作的数据库名
SELECT @LogicalFileName = '
table
name_log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- 你想设定的日志文件的大小(M)
Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE
TABLE
DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
SELECT @Counter = @Counter + 1
EXEC (@TruncLog)
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP
TABLE
DummyTrans
SET NOCOUNT OFF
8、说明:更改某个表
exec sp_changeobjectowner '
table
name','dbo'
9、存储更改全部表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
-- select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
close curObject
deallocate curObject
10、
SQL
SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:
Name score
Zhangshan 80
Lishi 59
Wangwu 50
Songquan 69
while((select min(score) from tb_
table
)<60)
begin
update tb_
table
set score =score*1.01
where score60
break
continue
数据开发-经典
1.按姓氏笔画排序:
Select * From
Table
Name Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多
2.数据库加密:
select encrypt('原始密码')
select pwdencrypt('原始密码')
select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')
select pwdencrypt('原始密码')
select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同
3.取回
表中
字段:
declare @list varchar(1000),
@
sql
nvarchar(1000)
select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
set @
sql
='select '+right(@list,len(@list)-1)+' from 表A'
exec (@
sql
)
4.查看硬盘分区:
EXEC master..xp_fixeddrives
5.比较A,B表是否相等:
if (select checksum_agg(binary_checksum(*)) from A)
(select checksum_agg(binary_checksum(*)) from B)
print '相等'
print '不相等'
6.杀掉所有的事件探察器进程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN('
SQL
profiler',N'
SQL
事件探查器')
EXEC sp_msforeach_worker '?'
7.
记录
搜索:
开头到N条
记录
Select Top N * From 表
-------------------------------
N到M条
记录
(要有主索引ID)
Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc
----------------------------------
N到结尾
记录
Select Top N * From 表 Order by ID Desc
例如1:一张表有一万多条
记录
,表的第一个字段 RecID 是自增长字段, 写一个
SQL
语句, 找出表的第31到第40个
记录
。
select top 10 recid from A where recid not in(select top 30 recid from A)
分析:如果这样写会产生某些问题,如果recid在
表中
存在逻辑索引。
select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据
表中
查找,这样由于索引中的顺序有可能和数据
表中
的不一致,这样就导致查询到的不是本来的欲得到的数据。
1, 用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题
2, 在那个子查询中也加条件:select top 30 recid from A where recid>-1
例2:查询
表中
的最后以条
记录
,并不知道这个表共有多少数据,以及表结构。
set @s = 'select top 1 * from T where pid not in (select top ' + str(@count-1) + ' pid from T)'
print @s exec sp_execute
sql
@s
9:获取当前数据库中的所有用户表
select Name from sysobjects where xtype='u' and status>=0
10:获取某一个表的所有字段
select name from syscolumns where id=object_id('表名')
select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = '表名')
两种方式的效果相同
11:查看与某一个表相关的视图、存储过程、函数
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'
12:查看当前数据库中所有存储过程
select name as 存储过程名称 from sysobjects where xtype='P'
13:查询用户创建的所有数据库
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
select dbid, name AS DB_NAME from master..sysdatabases where sid 0x01
14:查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where
table
_name = '表名'
15:不同服务器数据库之间的数据操作
--创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', '
SQL
OLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '
--查询示例
select * from ITSV.数据库名.dbo.表名
--导入示例
select * into 表 from ITSV.数据库名.dbo.表名
--以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV ', 'droplogins '
--连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset
--查询示例
select * from openrowset( '
SQL
OLEDB ', '
sql
服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
--生成本地表
select * into 表 from openrowset( '
SQL
OLEDB ', '
sql
服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
--把本地表导入远程表
insert openrowset( '
SQL
OLEDB ', '
sql
服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
select *from 本地表
--更新本地表
update b
set b.列A=a.列A
from openrowset( '
SQL
OLEDB ', '
sql
服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1
--openquery用法需要创建一个连接
--首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', '
SQL
OLEDB ', '远程服务器名或ip地址 '
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
--把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A
--3、opendatasource/openrowset
SELECT *
FROM opendatasource( '
SQL
OLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( '
SQL
OLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
select * from 本地表
SQL
Server基本函数
SQL
Server基本函数
1.字符串函数 长度与分析用
1,datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
2,substring(expression,start,length) 取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度
3,right(char_expr,int_expr) 返回字符串右边第int_expr个字符,还用left于之相反
4,isnull( check_expression , replacement_value )如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类
5,Sp_addtype 自定義數據類型
例如:EXEC sp_addtype birthday, datetime, 'NULL'
6,set nocount {on|off}
使返回的结果中不包含有关受 Transact-
SQL
语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-
SQL
语句影响的行数)。
SET NOCOUNT 为 OFF 时,返回计数
在
SQL
查询中:from后最多可以跟多少张表或视图:256
在
SQL
语句中出现 Order by,查询时,先排序,后取
在
SQL
中,一个字段的
最大
容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。
SQL
Server2000同步复制技术实现步骤
一、 预备工作
1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
--管理工具
--计算机管理
--用户和组
--右键用户
--新建用户
--建立一个隶属于administrator组的登陆windows的用户(SynUser)
2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:
我的电脑--D:\ 新建一个目录,名为: PUB
--右键这个新建的目录
--属性--共享
--选择"共享该文件夹"
--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser) 具有对该文件夹的所有权限
3.设置
SQL
代理(
SQL
SERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)
开始--程序--管理工具--服务
--右键
SQL
SERVERAGENT
--属性--登陆--选择"此账户"
--输入或者选择第一步中创建的windows登录用户名(SynUser)
--"密码"中输入该用户的密码
4.设置
SQL
Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)
企业管理器
--右键
SQL
实例--属性
--安全性--身份验证
--选择"
SQL
Server 和 Windows"
5.在发布服务器和订阅服务器上互相注册
企业管理器
--右键
SQL
Server组
--新建
SQL
Server注册...
--下一步--可用的服务器中,输入你要注册的远程服务器名 --添加
--下一步--连接使用,选择第二个"
SQL
Server身份验证"
--下一步--输入用户名和密码(SynUser)
--下一步--选择
SQL
Server组,也可以创建一个新组
--下一步--完成
6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)
(在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
开始--程序--Microsoft
SQL
Server--客户端网络实用工具
--别名--添加
--网络库选择"tcp/ip"--服务器别名输入
SQL
服务器名
--连接参数--服务器名称中输入
SQL
服务器ip地址
--如果你修改了
SQL
的端口,取消选择"动态决定端口",并输入对应的端口号
二、 正式配置
1、配置发布服务器
打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:
(1) 从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导
(2) [下一步] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他
sql
的服务器(选择自己)
(3) [下一步] 设置快照文件夹
采用默认\\servername\Pub
(4) [下一步] 自定义配置
可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置
否,使用下列默认设置(推荐)
(5) [下一步] 设置分发数据库名称和位置 采用默认值
(6) [下一步] 启用发布服务器 选择作为发布的服务器
(7) [下一步] 选择需要发布的数据库和发布类型
(8) [下一步] 选择注册订阅服务器
(9) [下一步] 完成配置
2、创建出版物
发布服务器B、C、D上
(1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令
(2)选择要创建出版物的数据库,然后单击[创建发布]
(3)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
(4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,
SQL
SERVER允许在不同的数据库如 orACLE或ACCESS之间进行数据复制。
但是在这里我们选择运行"
SQL
SERVER 2000"的数据库服务器
(5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表
(6)选择发布名称和描述
(7)自定义发布属性 向导提供的选择:
是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性
否 根据指定方式创建发布 (建议采用自定义的方式)
(8)[下一步] 选择筛选发布的方式
(9)[下一步] 可以选择是否允许匿名订阅
1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器
方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加
否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅
如果仍然需要匿名订阅则用以下解决办法
[企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项] 选择允许匿名请求订阅
2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示
(10)[下一步] 设置快照 代理程序调度
(11)[下一步] 完成配置
当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库
srv1.库名..author有字段:id,name,phone,
srv2.库名..author有字段:id,name,telphone,adress
srv1.库名..author增加
记录
则srv1.库名..author
记录
增加
srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新
--大致的处理步骤
--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步
exec sp_addlinkedserver 'srv2','','
SQL
OLEDB','srv2的
sql
实例名或ip'
exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码'
--2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动
。我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动
--然后创建一个作业定时调用上面的同步处理存储过程就行了
企业管理器
--
SQL
Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--"步骤名"中输入步骤名
--"类型"中选择"Transact-
SQL
脚本(T
SQL
)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句: exec p_process
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的
时间
安排
然后将
SQL
Agent服务启动,并设置为自动启动,否则你的作业不会被执行
设置方法:
我的电脑--控制面板--管理工具--服务--右键
SQL
SERVERAGENT--属性--启动类型--选择"自动启动"--确定.
--3.实现同步处理的方法2,定时同步
--在srv1中创建如下的同步处理存储过程
create proc p_process
--更新修改过的数据
update b set name=i.name,telphone=i.telphone
from srv2.库名.dbo.author b,author i
where b.id=i.id and
(b.name i.name or b.telphone i.telphone)
--插入新增的数据
insert srv2.库名.dbo.author(id,name,telphone)
select id,name,telphone from author i
where not exists(
select * from srv2.库名.dbo.author where id=i.id)
--删除已经删除的数据(如果需要的话)
delete b
from srv2.库名.dbo.author b
where not exists(
select * from author where id=b.id)
原书名: Microsoft
SQL
Server 2008 Administrator's Pocket Consultant
原出版社: Microsoft Press
作者: (美)William R. Stanek [作译者介绍]
译者: 贾洪峰
丛书名: 微软技术丛书
出版社:清华大学出版社
ISBN:9787302192671
上架
时间
:2009-2-26
出版日期:2009 年2月
开本:16开
页码:583
版次:1-1
SQL
Server专家的呕心力作,数据库管理员的实践宝典.
全面、深入地剖析
SQL
Server 2008新特性..
结构独特,实例丰富,操作性强...
全书按照由浅入深的逻辑共分为4部分,即管理基础、系统管理、数据管理以及优化与维护。这种分类方法不仅从理论上环环相扣,全面介绍数据库管理人员需要掌握的相关理论知识和工作技能,也从不同层次上体现了数据库管理员的工作内容及工作的要点和难点,能够科学地指导数据库管理员的日常工作。.
本书的特点是按照日常工作的逻辑来编排内容,并含有大量实例操作指导、技巧提示及t-
sql
代码,方便管理员日常的工作。..
本书适合所有
sql
server用户参考,更是数据库管理员的必备指南。...
William R.Stanek,微软MVP(最有价值专家),拥有20多年系统管理和高级编程的经验。他是屡获嘉奖的作家,著作多达70部,其中包括Microsoft Windows Server 2008 Inside Out。他也是“管理员必备指南“系列丛书的编辑。
封面 -19
封底 584
扉页 -18
版权 -17
《微软技术丛书》出版前言 -16
译者序 -14
前言 -13
目录 -9
第Ⅰ部分
SQL
Server 2008管理基础 1
第1章
SQL
Server 2008管理概况 3
1.1
SQL
Server 2008与硬件 4
1.2
SQL
Server 2008的版本 6
1.3
SQL
Server和Windows 8
1.3.1
SQL
Server的服务 8
1.3.2
SQL
Server登录和身份验证 9
1.3.3
SQL
Server的服务帐户 10
1.4 使用图形化管理工具 11
1.5 使用命令行工具 14
1.5.1 BCP 15
1.5.2
SQL
CMD 15
1.5.3 其他命令行工具 17
1.6 使用
SQL
Server PowerShell 18
1.6.1 运行和使用cmdlet 18
1.6.2 运行和使用
SQL
Server PowerShell 19
1.6.3 使用
SQL
Server cmdlet 20
第2章 部署
SQL
Server 2008 22
2.1
SQL
Server集成角色 22
2.1.1 使用
SQL
Server集成服务 22
2.1.2 使用
SQL
Server 2008的关系数据仓库 23
2.1.3 使用
SQL
Server 2008的多维数据库和数据挖掘 25
2.1.4 使用
SQL
Server 2008管理报表 26
2.2 规划
SQL
Server 2008的部署 27
2.2.1 建立服务器的性能系统 27
2.2.2 配置I/O子系统 28
2.2.3 确保可用性和可伸缩性 30
2.2.4 确保连接性和数据访问 31
2.2.5 管理
SQL
Server配置和安全性 32
2.3 运行安装程序和修改
SQL
Server安装 33
2.3.1 创建新的
SQL
Server实例 33
2.3.2 添加组件和实例 44
2.3.3 修复
SQL
Server 2008安装 44
2.3.4 升级
SQL
Server 2008版本 45
2.3.5 卸载
SQL
Server 45
第3章 管理外围安全、访问 以及网络配置 46
3.1 管理
SQL
Server的组件功能 46
3.2 配置
SQL
Server服务 49
3.2.1 管理服务配置 50
3.2.2 管理服务的状态和启动模式 53
3.2.3 设置启动的服务帐户 54
3.2.4 配置文件流 56
3.2.5 配置服务转储目录、错误报告和客户反馈报告 58
3.3 管理网络和
SQL
本地客户端配置 59
3.3.1 管理连接配置 60
3.3.2 配置Shared Memory网络配置 62
3.3.3 配置Named Pipes网络配置 62
3.3.4 配置TCP/IP网络配置 62
3.3.5 配置本地客户端配置的安全性 65
3.3.6 配置本地客户端协议的顺序 65
3.3.7 设置共享内存的本地客户端配置 66
3.3.8 设置命名管道的本地客户端配置 66
3.3.9 设置TCP/IP本地客户端配置 67
第4章 配置和优化
SQL
Server 2008 68
4.1 访问
SQL
Server的配置数据 69
4.1.1 使用系统目录和目录视图 70
4.1.2 使用系统存储过程 75
4.2 管理
SQL
Server配置选项的技巧 82
4.2.1 设置配置选项 82
4.2.2 使用SET选项 83
4.2.3 使用服务器选项 85
4.2.4 使用数据库选项 86
4.2.5 管理数据库的兼容性 87
4.3 通过存储过程配置
SQL
Server 88
4.3.1 使用
SQL
Server Management Studio查询 88
4.3.2 执行查询和改变设置 90
4.3.3 检查和设置配置参数 91
4.3.4 使用ALTER DATABASE改变设置 95
第Ⅱ部分
SQL
Server 2008的系统管理 99
第5章 管理企业 101
5.1 使用
SQL
Server Management Studio 101
5.1.1 开始使用
SQL
Server Management Studio 101
5.1.2 连接到特定的服务器实例 103
5.1.3 连接到特定数据库 103
5.2 管理
SQL
Server组 104
5.2.1 介绍
SQL
Server组 104
5.2.2 创建服务器组 106
5.2.3 删除服务器组 106
5.2.4 编辑和移动服务器组 107
5.2.5 添加
SQL
Server到一个组 107
5.3 管理服务器 107
5.3.1 注册已连接服务器 108
5.3.2 在“已注册的服务器”视图中注册新的服务器 109
5.3.3 注册以前注册的
SQL
Server 2000服务器 109
5.3.4 更新本地服务器注册 110
5.3.5 将服务器组和注册信息复制到另一台计算机 110
5.3.6 编辑注册属性 112
5.3.7 连接到服务器 113
5.3.8 从服务器断开连接 113
5.3.9 移动服务器到新的组 113
5.3.10 删除服务器注册 113
5.4 启动、停止和配置
SQL
Server代理 114
5.5 启动、停止和配置Microsoft分布式事务处理协调器 114
5.6 管理
SQL
Server启动 115
5.6.1 启用或防止
SQL
Server的自动启动 115
5.6.2 设置数据库引擎的启动参数 116
5.6.3 从命令行管理服务 118
5.6.4 管理
SQL
Server命令行的可执行文件 119
5.7 管理服务器活动 120
5.7.1 检查进程信息 120
5.7.2 跟踪资源等待和阻塞 122
5.7.3 检测修复死锁和阻塞连接 125
5.7.4 在
SQL
Server中跟踪命令的执行 126
5.7.5 终止服务器进程 127
第6章 使用
SQL
Server Management Studio配置
SQL
Server 128
6.1 使用
SQL
Server Management Studio管理配置 128
6.2 确定系统和服务器信息 130
6.3 配置身份验证和审核 130
6.3.1 设置身份验证模式 131
6.3.2 设置审核级别 132
6.3.3 启用或禁用C2审核登录 132
6.3.4 启用或禁用“符合公共标准” 133
6.4 调节内存的使用 133
6.4.1 动态配置内存 135
6.4.2 使用固定内存 136
6.4.3 启用AWE内存的支持 136
6.4.4 为索引优化内存 137
6.4.5 为查询分配内存 138
6.5 配置处理器和并行处理 138
6.5.1 优化CPU的使用 139
6.5.2 设置并行处理 141
6.6 配置线程、优先级和纤程 142
6.7 配置用户和远程连接 143
6.7.1 设置
最大
用户连接 144
6.7.2 设置默认连接选项 145
6.7.3 配置远程服务器连接 146
6.8 管理服务器设置 147
6.8.1 启用或禁用文件流 148
6.8.2 设置
SQL
Server的默认语言 148
6.8.3 允许和禁止嵌套触发器 149
6.8.4 控制查询的执行 149
6.8.5 配置2000年的支持 150
6.9 管理数据库设置 150
6.9.1 设置索引填充 151
6.9.2 配置备份和还原超时选项 152
6.9.3 配置备份和还原保持选项 153
6.9.4 用检查点清空缓存 153
6.9.5 压缩备份媒体 153
6.10 添加和删除活动目录的信息 154
6.11 修复配置故障 154
6.11.1 从损坏的配置中恢复 154
6.11.2 更改排序规则和重新生成master数据库 155
第7章 数据库管理的核心任务 157
7.1 数据库文件和日志 157
7.2 数据库管理基础 161
7.2.1 在
SQL
Server Management Studio中查看数据库的信息 161
7.2.2 使用T-
SQL
查看数据库信息 163
7.2.3 检查系统和示例数据库 164
7.2.4 检查数据库对象 164
7.3 创建数据库 166
7.3.1 在
SQL
Server Management Studio中创建数据库 167
7.3.2 使用T-
SQL
创建数据库 170
7.4 修改数据库及其选项 171
7.4.1 在
SQL
Server Management Studio中设置数据库选项 171
7.4.2 使用ALTER DATABASE修改数据库 172
7.4.3 配置自动选项 176
7.4.4 在数据库级别上控制ASNI的兼容性 177
7.4.5 配置参数化 179
7.4.6 配置游标选项 181
7.4.7 控制用户访问和数据库状态 182
7.4.8 设置联机、脱机或紧急模式 183
7.4.9 管理跨数据库链接和外部访问选项 183
7.4.10 配置恢复、日志
记录
和磁盘I/O错误检查选项 184
7.4.11 查看、更改和覆盖数据库选项 186
7.5 管理数据库和日志大小 186
7.5.1 配置
SQL
Server自动管理文件大小 186
7.5.2 手动扩展数据库和日志 187
7.5.3 手动压缩和收缩数据库 187
7.6 操作数据库 191
7.6.1 重命名数据库 191
7.6.2 清除和删除数据库 192
7.6.3 附加和分离数据库 193
7.7 提示和技巧 195
7.7.1 复制和移动数据库 195
7.7.2 移动数据库 199
7.7.3 移动tempdb和改变tempdb的大小 200
7.7.4 创建辅助数据和日志文件 201
7.7.5 防止事务日志错误 201
7.7.6 防止文件组充满的错误 202
7.7.7 创建新的数据库模板 202
7.7.8 配置数据库加密 202
第8章 全文搜索的管理 204
8.1 全文目录和索引 204
8.2 管理全文目录 207
8.2.1 查看目录属性 207
8.2.2 创建目录 209
8.2.3 启用表和视图的索引 210
8.2.4 编辑表和视图的索引 212
8.2.5 从表或视图中禁用和删除全文索引 212
8.2.6 填充全文目录 213
8.2.7 重新生成当前目录 216
8.2.8 清除旧的目录 217
8.2.9 删除目录 217
8.3 管理全文搜索 218
8.3.1 设置全文搜索的默认语言 218
8.3.2 使用非索引字表 219
8.3.3 创建非索引字表 220
8.3.4 管理非索引字表 222
8.3.5 创建和使用同义词库文件 223
第9章 管理
SQL
Server 2008的安全性 227
9.1
SQL
Server 2008安全性概况 227
9.1.1 使用安全主体和安全对象 228
9.1.2 理解安全对象的权限 229
9.1.3 检查授予安全对象的权限 231
9.2
SQL
Server 2008的身份验证模式 234
9.2.1 Windows身份验证 234
9.2.2 混合模式和
SQL
Server登录 234
9.3 特殊目的的登录和用户 235
9.3.1 使用管理员组 235
9.3.2 使用管理员用户帐户 236
9.3.3 使用sa登录 236
9.3.4 使用NETWORK SERVICE和SYSTEM登录 236
9.3.5 使用guest用户 236
9.3.6 使用dbo用户 237
9.3.7 使用sys和INFORMATION_SCHEMA用户 238
9.4 权限 238
9.4.1 对象权限 238
9.4.2 语句权限 243
9.4.3 隐含权限 243
9.5 角色 243
9.5.1 服务器角色 244
9.5.2 数据库角色 245
9.6 管理服务器登录 247
9.6.1 查看和编辑现有的登录 247
9.6.2 创建登录 249
9.6.3 用T-
SQL
编辑登录 251
9.6.4 允许或拒绝访问服务器 252
9.6.5 启用、禁用和解锁登录 253
9.6.6 删除登录 254
9.6.7 更改密码 254
9.7 配置服务器角色 255
9.7.1 为登录分配角色 255
9.7.2 为多个登录分配角色 256
9.7.3 撤销服务器登录的访问权限和授予的角色 257
9.8 控制数据库访问和管理 258
9.8.1 为登录分配访问权限和角色 258
9.8.2 为多个登录分配角色 259
9.8.3 创建标准的数据库角色 260
9.8.4 创建应用程序数据库角色 261
9.8.5 删除数据库用户的角色成员关系 262
9.8.6 删除用户定义的角色 262
9.8.7 管理访问和角色的Transact-
SQL
命令 263
9.9 管理数据库权限 264
9.9.1 为语句分配数据库权限 264
9.9.2 登录的对象权限 269
9.9.3 多个登录的对象权限 270
第Ⅲ部分
SQL
Server 2008的数据管理 273
第10章 操作架构、表、索引和视图 275
10.1 处理架构 275
10.1.1 创建架构 276
10.1.2 修改架构 278
10.1.3 将对象移动到新架构 279
10.1.4 删除架构 280
10.2 表的概况 280
10.3 表的实质 281
10.3.1 了解数据页 281
10.3.2 了解区 282
10.3.3 了解表的分区 283
10.4 处理表 283
10.4.1 创建表 284
10.4.2 修改现有的表 288
10.4.3 查看表的行和大小的信息 290
10.4.4 显示表属性和权限 291
10.4.5 显示
表中
当前的值 291
10.4.6 复制表 292
10.4.7 重命名和删除表 292
10.4.8 在一个
表中
添加和删除列 293
10.4.9 编写表脚本 294
10.5 管理表的值 294
10.5.1 使用原始数据类型 294
10.5.2 使用固定长度、可变长度和
最大
长度的字段 298
10.5.3 使用用户定义的数据类型 299
10.5.4 允许和不允许Null值 301
10.5.5 使用默认值 302
10.5.6 使用稀疏列 302
10.5.7 使用标识和全局唯一标识符 303
10.5.8 使用用户定义的表类型 304
10.6 使用视图 307
10.6.1 操作视图 307
10.6.2 创建视图 308
10.6.3 修改视图 311
10.6.4 使用可更新视图 312
10.6.5 管理视图 312
10.7 创建和管理索引 313
10.7.1 了解索引 313
10.7.2 使用聚集索引 315
10.7.3 使用非聚集索引 315
10.7.4 使用XML索引 315
10.7.5 使用筛选索引 316
10.7.6 确定应当索引哪些列 317
10.7.7 索引计算列和视图 318
10.7.8 查看索引属性 318
10.7.9 创建索引 320
10.7.10 管理索引 324
10.7.11 使用数据库引擎优化顾问 326
10.8 列约束和规则 329
10.8.1 使用约束 329
10.8.2 使用规则 333
10.9 创建已分区表和索引 334
10.9.1 创建分区函数 334
10.9.2 创建分区方案 335
10.9.3 创建分区 335
10.9.4 查看和管理分区 337
10.10 压缩表、索引和分区 338
10.10.1 使用行和页压缩 338
10.10.2 设置或改变压缩设置 339
第11章 数据的导入和导出及转换 341
11.1 使用集成服务 341
11.1.1 集成服务简介 341
11.1.2 集成服务工具 342
11.1.3 集成服务和数据提供程序 344
11.1.4 集成服务包 344
11.2 使用
SQL
Server导入和导出向导创建包 345
11.2.1 阶段1:数据源和目标的配置 346
11.2.2 阶段2:复制或查询 353
11.2.3 阶段3:格式化和转换 357
11.2.4 阶段4:保存和执行 360
11.3 了解BCP 363
11.3.1 BCP 基础 363
11.3.2 BCP 语法 363
11.3.3 BCP 权限和模式 366
11.3.4 使用BCP导入数据 366
11.3.5 使用BCP导出数据 368
11.4 BCP脚本 368
11.5 使用BULK INSERT 命令 369
第12章 链接服务器与分布式事务 371
12.1 使用链接服务器和分布式数据 371
12.1.1 使用分布式查询 372
12.1.2 使用分布式事务 374
12.1.3 运行分布式事务处理协调器服务 375
12.2 管理链接服务器 375
12.2.1 添加链接服务器 376
12.2.2 配置链接服务器的安全性 379
12.2.3 设置远程和链接服务器的服务器选项 381
12.2.4 删除链接服务器 382
第13章 实施快照、合并和事务复制 384
13.1 复制的概况 384
13.1.1 复制组件 385
13.1.2 复制代理和作业 386
13.1.3 复制的类型 387
13.2 复制的计划 389
13.2.1 复制模式 389
13.2.2 复制的预备任务 390
13.3 分发服务器的管理 392
13.3.1 设置新的分发服务器 392
13.3.2 更新分发服务器 396
13.3.3 创建分发数据库 398
13.3.4 启用和更新发布服务器 399
13.3.5 启用发布数据库 399
13.3.6 删除分发数据库 400
13.3.7 禁用发布和分发 400
13.4 创建和管理发布 401
13.4.1 创建发布 401
13.4.2 查看和更新发布 407
13.4.3 设置发布属性 408
13.4.4 设置代理安全性和进程帐户 409
13.4.5 控制订阅访问发布 410
13.4.6 为发布创建脚本 410
13.4.7 删除发布 411
13.5 订阅发布 411
13.5.1 订阅的实质 411
13.5.2 创建订阅 412
13.5.3 查看订阅属性 415
13.5.4 更新、维护和删除订阅 416
13.5.5 验证订阅 416
13.5.6 重新初始化订阅 417
第Ⅳ部分
SQL
Server 2008的优化与维护 419
第14章 分析和监视
SQL
Server 2008 421
14.1 监视服务器的性能和活动 421
14.1.1 监视
SQL
Server的原因 421
14.1.2 为监视做准备 422
14.1.3 监视工具和资源 423
14.2 使用复制监视器 425
14.2.1 启动并使用复制监视器 425
14.2.2 添加发布服务器和发布服务器组 426
14.3 使用事件日志 427
14.3.1 检查应用程序日志 428
14.3.2 检查
SQL
Server事件日志 430
14.3.3 检查
SQL
Server代理事件日志 432
14.4 监视
SQL
Server的性能 433
14.4.1 选择要监视的计数器 433
14.4.2 创建性能日志 435
14.4.3 查看数据收集器报告 439
14.4.4 配置性能计数器警报 440
14.5 配置管理数据仓库 441
14.5.1 了解管理数据仓库 441
14.5.2 创建管理数据仓库 441
14.5.3 设置数据收集 442
14.5.4 管理收集和生成报表 442
14.6 使用事件探查器解决性能问题 442
14.6.1 使用事件探查器 443
14.6.2 新建跟踪 444
14.6.3 使用跟踪 447
14.6.4 保存跟踪 447
14.6.5 重播跟踪 448
第15章 备份和还原
SQL
Server 2008 452
15.1 创建备份和还原计划 452
15.1.1 开始备份和还原计划 452
15.1.2 规划镜像与镜像数据库的备份 456
15.1.3 规划被复制数据库的备份 456
15.1.4 规划大型数据库的备份 458
15.1.5 规划备份压缩 458
15.2 选择备份设备和媒体 459
15.3 使用备份策略 461
15.4 创建备份设备 462
15.5 执行备份 464
15.5.1 在
SQL
Server Management Studio中创建备份 464
15.5.2 使用多个设备的条带备份 468
15.5.3 使用Transact-
SQL
备份 469
15.5.4 执行事务日志备份 472
15.6 还原数据库 473
15.6.1 数据库损坏及解决方法 473
15.6.2 从正常备份还原数据库 475
15.6.3 还原文件和文件组 479
15.6.4 将数据库还原到不同位置 481
15.6.5 还原丢失的数据 481
15.6.6 创建备用服务器 482
15.6.7 使用Transact-
SQL
还原命令 483
15.7 还原master数据库 487
第16章 数据库自动化和维护 489
16.1 数据库自动化和维护概述 489
16.2 使用数据库邮件 490
16.2.1 执行初始数据库邮件配置 490
16.2.2 管理数据库邮件配置文件和帐户 495
16.2.3 查看和更改数据库邮件系统参数 496
16.3 使用
SQL
Server代理 497
16.3.1 访问警报、操作员和作业 497
16.3.2 配置
SQL
Server代理服务 497
16.3.3 设置
SQL
Server代理邮件配置文件 498
16.3.4 使用
SQL
Server代理重新启动服务 499
16.4 管理警报 499
16.4.1 使用默认警报 499
16.4.2 创建错误消息警报 500
16.4.3 处理警报响应 501
16.4.4 删除、启用和禁用警报 503
16.5 管理操作员 503
16.5.1 注册操作员 503
16.5.2 删除和禁用对操作员的通知 504
16.5.3 配置防故障操作员 505
16.6 计划作业 505
16.6.1 创建作业 506
16.6.2 指定或更改作业定义 506
16.6.3 设置执行步骤 508
16.6.4 配置作业计划 511
16.6.5 处理作业警报 514
16.6.6 处理通知消息 514
16.6.7 管理现有作业 515
16.6.8 管理作业类别 516
16.7 自动完成服务器到服务器的日常管理任务 517
16.7.1 在数据库之间复制用户、表、视图和其他对象 517
16.7.2 在数据库之间复制警报、操作员和计划作业 519
16.8 多服务器管理 519
16.8.1 事件转发 520
16.8.2 多服务器作业计划 521
16.9 数据库维护 523
16.9.1 数据库维护清单 523
16.9.2 使用维护计划 524
16.9.3 检查和维护数据库完整性 529
第17章 管理日志传送与数据库镜像 534
17.1 日志传送 534
17.1.1 日志传送:如何工作 534
17.1.2 为日志传送做准备 536
17.1.3 将
SQL
Server 2000 日志传送升级到
SQL
Server 2008日志传送 537
17.1.4 在主数据库上启用日志传送 537
17.1.5 添加日志传送辅助数据库 541
17.1.6 改变事务日志备份的
时间
间隔 544
17.1.7 改变复制和还原的
时间
间隔 545
17.1.8 监视日志传送 545
17.1.9 故障转移到辅助数据库 546
17.1.10 禁用和删除日志传送 548
17.2 数据库镜像 548
17.2.1 数据库镜像基础知识 548
17.2.2 配置数据库镜像 549
17.2.3 管理和监视镜像 553
17.2.4 使用故障转移进行恢复 556
17.2.5 删除数据库镜像 557
17.3 使用镜像和日志传送 557
第18章 实施基于策略的管理 559
18.1 基于策略的管理简介 559
18.2 使用基于策略的管理 561
18.3 在整个企业内管理策略 566
18.3.1 导入和导出策略 566
18.3.2 配置中央管理服务器 568
18.3.3 针对多个服务器执行语句 571
18.3.4 配置和管理策略方面 571
18.3.5 创建和管理策略条件 573
18.3.6 创建和管理策略 575
18.3.7 管理策略目标和托管策略 578
18.3.8 评估策略 580
18.3.9 基于策略的管理策略疑难解答 582
对于数据库管理员来说,
SQL
Server 2008新增的管理功能,就足以把
SQL
Server 2008变成令人瞩目的新产品。全新的基于策略的管理、多重服务器查询功能以及数据收集器/管理仓库等,为日常负责管理大型复杂数据库环境的数据库管理员提供了强大的新功能。.
在安全性方面,
SQL
Server 2005是以数据加密的形式提供数据安全性,在
SQL
Server 2008中,除了新增的加密函数外,还推出两种大幅增强加密特性的功能:“可扩展密钥管理”和“透明数据加密”。可扩展密钥管理(EKM)功能允许第三方企业密钥管理(EKM)和硬件安全模块(HSM)供应商在
SQL
Server中注册其设备。一旦注册,
SQL
Server用户便可以使用在这些模块上存储的加密密钥,并利用这些模块支持的高级加密,比如大容量加密/解密和很多密钥管理函数。透明数据加密(TDE)可对数据和日志文件执行实时I/O加密和解密。
SQL
Server 2008引入了对Windows PowerShell的支持。PowerShell是一个功能强大的脚本外壳,管理员和开发人员可以通过它自动执行服务器管理和应用程序部署任务。与Transact-
SQL
脚本相比,PowerShell语言能够支持更复杂的逻辑,使
SQL
Server管理员能够生成强大的管理脚本。PowerShell脚本还可用来管理Microsoft的其他服务器产品,这样就为管理员提供了一个跨服务器的公用脚本语言。..
能从
SQL
Server 2008中获益的不只是数据库管理员,它的许多新功能是为了协助数据库开发人员而设计的。
SQL
Server 2008提供全新的LINQ to
SQL
提供程序,让开发人员直接对
SQL
Server数据表和数据行发出LINQ命令,进一步强化LINQ的性能,以缩短建立新数据查询所花的
时间
。另外,
SQL
Server 2008采用全新的FILESTREAM数据类型来处理大型二进制对象。
SQL
Server 2008的众多强大功能,相信用户在实际使用过程中会逐一体会。
本书的翻译过程凝聚了很多人的心血,全书主要章节由贾洪峰翻译,其他参与翻译的人员还有张海、时朋泉、罗双华、李强丽、郭辉、缪素芬、王雅丽、李晓晓、刘建静、刘阿娜、蔡广华、黄艳丽、周桦、吴士珍、韩丽、刘建卓、张丛丛、王山花、王亮、刘建喜、韩斌、李锋和王维玲。译者在翻译过程中,尽量保持原书的特色,并对书中出现的术语和难句进行了仔细的推敲与研究,但疏漏和争议之处在所难免,望广大读者提出宝贵的意见。
最后,希望本书成为您的良师益友,为您提供好的指引。...
本书的写作初衷是为
SQL
Server 2008系统管理员提供简明的、必不可少的参考资源。它涵盖管理员需要知道的用于执行
SQL
Server核心管理任务的每一方面,是案头必备的重要指南。本书尽量利用有限的篇幅来呈现管理员真正需要的信息,便于他们准确找到需要的信息以快速完成工作。.
有代表性的选项(并不一定使用)。本书最重要的目的之一是保证内容精炼、言简意赅,但同时要保证尽量涵盖更多的内容。不同于动辄上千页的大部头或者只有100页的快速参考,本书是一本有价值的资源指南,它可以帮助管理员方便、快捷地完成任务,解决问题,并且运用先进的
SQL
Server技术,例如复制、分布式查询和多服务器的系统管理。
本书面向的读者
本书概述了
SQL
Server的Standard Edition、Enterprise Edition、Developer Edition、Web Edition和Workgroup Edition,目标读者包括以下几类。
●正在使用
SQL
Server 2008的数据库管理员。
●肩负部分管理员职责的熟练用户。
●从以前版本迁移到
SQL
Server 2008的管理员。
●从其他数据库架构转移到
SQL
Server 2008的管理员。
为了包含尽可能多的知识,我刁;得不假设读者已经具备基本的网络工作技能,并且有
SQL
Server的基础知识。在这个基础上,我不会花整章的篇幅来介绍
SQL
Server的结构或者如何运行简单的
SQL
查询。不过书中会介绍
SQL
Server的安装、配置、企业级服务器的管理、性能调节、优化和维护等方面的知识。
我也假设读者像熟悉标准的Windows用户界面一样熟悉
SQL
命令和存储过程。如果需要学习
SQL
基础知识,应该阅读其他资源(很多资源都可以通过Microsoft.Press
获得
)。
本书的结构
本书的写作初衷是满足
SQL
Server日常系统管理的需求,因此本书是按工作任务而不是按
SQL
Server的功能来组织的。使用本书前应该认识到,“管理员必备指南系列”不同于“管理员完全参考指南系列”。虽然二者都是管理员的参考书籍,但前者简明扼要,后者则比较全面系统,涵盖在企业中部署产品和技术的方方面面。
查阅速度和难易程度是这类必备指南最关键的部分。本书有详细的目录可用于快速找到问题的答案。本书还有很多其他便于快速查阅的特性,例如快速按步骤操作的说明、列表、要点回顾和交叉引用。全书分为几大部分,各部分开始处首先列出包含哪些章。
第Ⅰ部分“
SQL
Server 2008管理基础”包含
SQL
Server管理的基础任务。第1章简要介绍
SQL
Server管理工具、技术和概念。第2章讨论
SQL
Server的部署。第3章讲述如何设置
SQL
Server的服务、组件和网络功能。第4章详细解释可用于配置和调整
SQL
Server的结构。这一章着眼于
SQL
Server 2008的系统目录,继而讨论目录查询及存储过程。
第Ⅱ部分“
SQL
Server 2008的系统管理”介绍
SQL
Server的关键管理任务。第5章详细介绍服务器组和服务器的管理技术。第6章探究如何用
SQL
Server Management Studio配置和调整
SQL
Server。读者将借此了解优化内存使用、并行处理、身份验证和审核等方面的知识。第7章介绍用于创建和管理数据库的核心管理任务。按照逻辑延续,第8章介绍管理全文目录、全文索引、非索引字、非索引字表、词库文件和其他全文搜索组件的关键技术。第9章介绍
SQL
Server的安全性。要管理
SQL
Server的安全性,管理员要创建用户登录、设置登录权限以及分配角色。管理员分配的权限和角色决定了用户可以执行的操作,也定义了他们可以访问什么类型的数据。..
SQL
Server数据管理是第Ⅲ部分的主题。第10章概括介绍创建、管理和优化架构、表、索引与视图的技术。第11章介绍数据的导入和导出,还有旧的备用的批量复制程序(BCP)。第12章的重点在于
SQL
Server数据库之间的连接,以及和其他数据源的连接。同时还会详细讨论分布式查询、分布式事务、微软分布式事务处理协调器(MSDTC)和链接服务器。第13章讲述数据复制,其中要介绍最新的复制技术,包括合并复制和立即更新订阅。
第Ⅳ部分“
SQL
Server 2008的优化与维护”,涵盖用于增强和维护
SQL
Server的管理任务。第14章阐述如何使用服务器日志,监控
SQL
Server运行情况以及解决运行问题。第15章首先揭示如何建立备份和还原计划。之后,介绍创建和还原备份的一般任务。第16章说明数据库的自动化和维护,描述了如何创建警报、计划作业、处理操作员通知等,其中还要介绍如何创建维护计划和如何解决数据库一致性的问题。第17章首先讨论日志传送和数据库镜像。日志传送和数据库镜像是灾难后恢复解决方案,旨在帮助提高可用性以及快速恢复
SQL
Server 2008。第18章介绍实现基于策略的管理(Policy-Based Management)所需的关键任务。基于策略的管理中定义的策略不仅包括用于配置
SQL
Server设置的,还涉及是否更改设置及如何更改设置。在部署
SQL
Server 2008之前,应该熟悉可以使用的各个选项,并确定是否将服务器放入特定的管理组。
本书的约定
本书采用多种方法来保证内容清晰易懂。要求读者实际输入的命令采用粗体显示,代码采用等宽字体。本书还有以下特色段落。
●注意对某一个需要着重强调的知识点提供额外的详细说明。
. ●提示提供有帮助的提示或额外的信息。
●警告可能出现需要注意的潜在问题时发出警告。
●实践提示讨论内容较深的主题时,提供实际的建议。
●最佳实践介绍当使用高级配置和管理概念时,可以采用的最好的技术。
我真心希望读者能发现本书提供了使用
SQL
Server快速高效执行重要管理任务所需的所有知识。如有任何意见,欢迎发送电子邮件至williamstanek@aol.com,或访问http://www.williamstanek.com/。
我们尽全力保证本书的准确性。Microsoft Press通过万维网提供本书勘误,网址为http://mspress.microsoft.com/support/。
如果您对本书有任何看法、问题或者想法,请通过以下任何一种方式告知我们。
通信地址:
Microsoft Press
Attn:Microsoft
SQL
Server 2008
Administrator's Pocket Consultant Editor
One Microsoft Way
Redmond,WA 98052-6399
电子邮箱:
mspinput@microsoft.com
请注意,以上的地址不提供产品支持,关于支持信息,请访问http://support.microsoft.com/default.aspx。
在线查找信息
如要从Microsoft Press
获得
更多信息,请访问新的Microsoft Press Online网站,它提供了“一站式”的在线资源访问平台,可以浏览Microsoft Press出版的众多在业界领先的书籍及其相关的更新、样章、文章、脚本和电子书。网址为http://www.microsoft.com/learning/books/online/developer和http://www.microsoft.com/learning/books/online/serverclient
一、问题的提出
在应用系统开发初期,由于开发数据库数据比较少,对于查询
SQL
语句,复杂视图的的编写等体会不出
SQL
语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是
SQL
语句的优化。对于海量数据,劣质
SQL
语句和优质
SQL
语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的
SQL
语句,提高系统的可用性。
在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在
SQL
语句的where子句中写的
SQL
代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种
SQL
语句就是所谓的劣质
SQL
语句。在编写
SQL
语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的
SQL
语句。
二、
SQL
语句编写注意问题
下面就某些
SQL
语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的
SQL
,系统在运行该
SQL
语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。
1. IS NULL 与 IS NOT NULL
不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。
任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。
2. 联接列
对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。
下面是一个采用联接查询的
SQL
语句,
select * from employss where first_name||''||last_name ='Beill Cliton';
上面这条语句完全可以查询出是否有Bill Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。
当采用下面这种
SQL
语句的编写,Oracle系统就可以采用基于last_name创建的索引。
*** where first_name ='Beill' and last_name ='Cliton';
. 带通配符(%)的like语句
同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工
表中
查询名字中包含cliton的人。可以采用如下的查询
SQL
语句:
select * from employee where last_name like '%cliton%';
这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:
select * from employee where last_name like 'c%';
4. Order by语句
ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。
仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。
5. NOT
我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:
... where not (status ='VALID')
如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例:
... where status <>'INVALID';
对这个查询,可以改写为不使用NOT:
select * from employee where salary<3000 or salary>3000;
虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。
虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。
===============================================================================================
我们要做到不但会写
SQL
,还要做到写出性能优良的
SQL
,以下为笔者学习、摘录、并汇总部分资料与大家分享!
(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):
ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving
table
)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择
记录
条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection
table
)作为基础表, 交叉表是指那个被其他表所引用的表.
(2) WHERE子句中的连接顺序.:
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉
最大
数量
记录
的条件必须写在WHERE子句的末尾.
(3) SELECT子句中避免使用 ‘ * ‘:
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的
时间
(4) 减少访问数据库的次数:
ORACLE在内部执行了许多工作: 解析
SQL
语句, 估算索引的利用率, 绑定变量 , 读数据块等;
(5) 在
SQL
*Plus ,
SQL
*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200
(6) 使用DECODE函数来减少处理
时间
:
使用DECODE函数可以避免重复扫描相同
记录
或重复连接相同的表.
(7) 整合简单,无关联的数据库访问:
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)
(8) 删除重复
记录
:
最高效的删除重复
记录
方法 ( 因为使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9) 用TRUNCATE替代DELETE:
当删除
表中
的
记录
时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行
时间
也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)
(10) 尽量多使用COMMIT:
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句
获得
的锁
c. redo log buffer 中的空间
d. ORACLE为管理上述3种资源中的内部花费
--查询
时间
最大
值
select create_by,
isnull((select max(create_time) from a_task_carry),'')
最大
的
时间
,
create_time
from a_task_carry
CREATE
TABLE
tbMaxDate
Guid uniqueidentifier Primary Key default upper((replace(newid(),'-',''))) not null,
Name varchar(255) not null,
createTime datetime not null
insert i...
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java...
SELECT * FROM
table
_name ORDER BY id;
其中,
table
_name是你要排序的表名,id是你要排序的字段名。如果要按照id从大到小排序,可以在id后面加上DESC关键字:
SELECT * FROM
table
_name ORDER BY id DESC;