今天老外有一个需求,要求将某一个用户下的所有表的创建脚本抓出来,并且每个表保存为一个文件,以下为脚本:
set feedback off
set pagesize 0
set heading off
set verify off
set linesize 200
set serveroutput on size 1000000
set trimspool on
define outputpath
accept outputpath char default ‘c:\’ prompt ‘pls input output path:’
define runfile = ‘c:\runfile.sql’
spool &runfile
prompt set feedback off
prompt set pagesize 0
prompt set heading off
prompt set verify off
prompt set linesize 500
prompt set trimspool on
prompt SET serveroutput on long 999999
prompt EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,’STORAGE’,false); (more…)
表结构:
演示数据如下:
写法一:
CREATE PROCEDURE UP_S_LocationTreeByLocationID
@LocationID VARCHAR(36)
AS
BEGIN
SET NOCOUNT ON
DECLARE @Level INT
DECLARE @Temp TABLE(LocationID VARCHAR(36),ParentID VARCHAR(36),iLevel INT,LocationNm VARCHAR(40))
DECLARE @Stack TABLE(LocationID VARCHAR(36),iLevel INT)
SET @Level = 1
INSERT INTO @Temp
SELECT LocationID,
ParentLocationID,
@Level,
LocationNm
FROM tblLocation
WHERE LocationID = @LocationID
INSERT INTO @Stack VALUES(@LocationID,@Level)
WHILE @Level > 0
BEGIN
IF EXISTS(SELECT 1 FROM @Stack WHERE iLevel = @Level)
BEGIN
SELECT @LocationID = LocationID
FROM @Stack
WHERE iLevel = @Level
PRINT @LocationID
DELETE FROM @Stack
WHERE LocationID = @LocationID
AND iLevel = @Level
INSERT INTO @Stack
SELECT LocationID,@Level+1
FROM tblLocation
WHERE ParentLocationID = @LocationID
INSERT INTO @Temp
SELECT LocationID,
ParentLocationID,
@Level+1,
LocationNm
FROM tblLocation
WHERE ParentLocationID = @LocationID
IF @@ROWCOUNT > 0
BEGIN
SET @Level = @Level +1
END
END
ELSE
SET @Level = @Level -1
END
SELECT * FROM @Temp
END
GO
写法二:
CREATE PROCEDURE UP_S_LocationTreeByLocationID
@LocationID VARCHAR(36)
AS
BEGIN
SET NOCOUNT ON
DECLARE @Level INT
SET @Level = 1
DECLARE @Temp TABLE(LocationID VARCHAR(36),ParentID VARCHAR(36),iLevel INT,LocationNm VARCHAR(40),RouteID VARCHAR(36),RouteNm NVARCHAR(40))
INSERT INTO @Temp
SELECT LocationID,
ParentLocationID,
@Level,
LocationNm
FROM tblLocation
WHERE LocationID = @LocationID
WHILE EXISTS(SELECT 1 FROM tblLocation a,@Temp b WHERE a.ParentLocationID = b.LocationID AND a.LocationID NOT IN(SELECT LocationID FROM @Temp))
BEGIN
INSERT INTO @Temp
SELECT LocationID,
ParentLocationID,
@Level+1,
LocationNm,
RouteID,
RouteNm
FROM tblLocation JOIN @Temp t ON ParentLocationID = LocationID
AND LocationID NOT IN(SELECT LocationID FROM @Temp)
SET @Level = @Level +1
END
SELECT * FROM @Temp
END
GO
执行结果如下:
执行语句:UP_S_LocationTreeByLocationID ‘1′
第一种写法
第二种写法
原文出自:http://www.chinaunix.net/jh/19/132866.html
ORA-01031: insufficient privileges
#############################################
#
# NAME: troubleshoot connect internal.txt
#
# DESCRIPTION:
# connect internal
# connect / as sysdba 要口令问题:
# refer (METALINK,ORACLEDOC),
# metalink search words(connect internal)
# NOTE:
#
# modifiy (MM/DD/YY) AUTHOR
# 05/03/03 ZORROL
#############################################
————————————————————
1.检查sqlnet.ora 文件.
sqlnet.ora 文件损坏或格式不对可以导致出现该问题。
sqlnet.ora 文件可能存放路径为:$TNS_ADMIN/sqlnet.ora
如果没有设置$TNS_ADMIN默认在$ORACLE_HOME/network/admin/sqlnet.ora 或 $HOME/sqlnet.ora
(1).可以从别的机器拷贝一个文件过来,注意备份原来的sqlnet.ora。
—检查sqlnet.ora 文件内容
(2).检查SQLNET.AUTHENTICATION_SERVICES
如果没有使用dblink.检查该行并设置
SQLNET.AUTHENTICATION_SERVICES = (BEQ,NONE)
(3).SQLNET.CRYPTO_SEED
在unix 下不需要该参数。如果存在该行,注释掉或删掉
(4).AUTOMATIC_IPC
如果该参数为 ON,将强制使用”TWO_TASK” 连接
最好设置为OFF: AUTOMATIC_IPC = OFF (more…)
好久没来更新blog了,主要是最近比较忙,忙的结果是回到家什么都不想做,什么都没念头,只想倒头就睡,当然这不过是骗人的借口而已,呵呵…看来要坚持做某件事情还真的很难,就象前段时间想每天坚持学点英语,结果没几天就不了了之了:)
上次美国佬要做数据同步,数据量很小,当时想用DTS做,但美国跟苏州这里不能直接相连,做数据库备份又太大,而其所需的数据又不多,考虑再三,如果能自动生成数据插入语句,然后将生成的文件发给美国,那边执行就可以了,想法很好,但怎么实施呢?在 oracle 里面可以通过logminer来实现,在Sybase里有unload可以实现,在sql server里好象没有专门的工具或命令可实现,怎么办呢,只能自己写脚本实现了…脚本如下:
if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[generate_insert_statement]‘) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure [dbo].[generate_insert_statement]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE generate_insert_statement
@tablename nvarchar(128),
@dbname nvarchar(128),
@objowner nvarchar(128),
@collist varchar(8000)
AS
/*
–@tablename is table name which you want to export data
–@dbname is the database name
–@objowner is the table owner ,default is dbo
@collist is column list that you want to export
*/
set nocount on
declare @errmsg varchar(100)
if isnull(@tablename,”)=”
begin
set @errmsg=’The tablename must be specified’
goto ErrH
end
set @dbname=isnull(@dbname,”)
set @objowner=isnull(@objowner,”)
declare @colname nvarchar(128)
declare @coltype nvarchar(128)
declare @sql1 varchar(8000)
declare @sql2 varchar(8000)
declare @fet_sql varchar(8000)
declare @flag smallint
if isnull(@collist,”)<>”
begin
set @collist=””+replace(@collist,’,',char(39)+char(44)+char(39))+””
end
set @fet_sql=’select sc.name ,st.name from ‘+@dbname+’.'+@objowner+’.syscolumns sc,’+@dbname+’.'+@objowner+’.systypes st
where sc.id=(select id from ‘+@dbname+’.'+@objowner+’.sysobjects where xtype=”U” and name=”’+@tablename+”’)
and sc.xtype=st.xtype and sc.xusertype=st.xusertype ‘+case when isnull(@collist,”)=” then ” else ‘and sc.name in(‘+@collist+’)’ end
exec(@fet_sql)
if @@rowcount=0
begin
set @errmsg=’The table or column does exist’
goto ErrH
end
set @fet_sql=@fet_sql+’ and (st.name in(”image”,”text”,”ntext”) or st.status=3)’
exec(@fet_sql)
if @@rowcount>0
begin
set @errmsg=’The procedures does not support column that the data type is image,text,ntext,also does not support user defined data type’
goto ErrH
end
set @flag=1
if isnull(@collist,”)=”
begin
set @sql1=’ select ”insert into ‘+@tablename
end
else
begin
set @sql1=’ select ”insert into ‘+@tablename+’(’
end
set @sql2=’ values(”’
set @fet_sql=’declare fet_col cursor for ‘+left(@fet_sql,len(@fet_sql)-56)
exec(@fet_sql)
open fet_col
fetch next from fet_col into @colname,@coltype
while(@@fetch_status=0)
begin
if isnull(@collist,”)<>”
begin
set @sql1=@sql1+@colname+’,’
end
set @flag=case when @coltype in(’int’,'bigint’,'binary’,'bit’,'decimal’,'numeric’,’smallint’,'tinyint’) then 0 when @coltype in(’datetime’,’smalldatetime’,'timestamp’) then 1 when @coltype in(’float’,'real’,'money’,’smallmoney’) then 2 else 3 end
set @sql2=@sql2+’+case when ‘+@colname+’ is null then ‘+char(39)+’null’+char(39) +’ else ‘+case when @flag in(1,3) then ‘char(39)+’+case when @flag=1 then ‘convert(varchar(20),’+@colname+’,120)’ else @colname end+’+char(39)’ when @flag=0 then ‘cast(‘+@colname+’ as varchar(50))’
when @flag=2 then ‘convert(varchar(50),’+@colname+’,2)’ end+’ end+char(44)’
fetch next from fet_col into @colname,@coltype
end
set @sql2=left(@sql2,len(@sql2)-9)
if isnull(@collist,”)<>”
begin
set @sql1=left(@sql1,len(@sql1)-1)
set @sql1=@sql1+’)’
end
set @sql2=@sql2+’+”)” from ‘+@dbname+’.'+@objowner+’.'+@tablename
close fet_col
deallocate fet_col
–print @sql1+@sql2
exec(@sql1+@sql2)
return
ErrH:
raiserror 16000 @errmsg
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
该脚本基本能满足需求,但不支持有用户自定义数据类型及ntext,image等数据类型的表,如果大家有什么好的解决方法,不妨留言告诉我,谢谢先:)
国庆回来等到了期待已久的dell 700M笔记本,配置如下:
CPU:迅驰1.7G
内存:1G
硬盘:80G
显示器:12.1英寸 WXGA TFT 显示屏
感觉还可以,但就是键盘小了点,比较适合女孩子使用:)
在用的过程中发现每次启动时数字键盘总是开启的(Num lock的灯总是亮着),给输入密码造成很大不便…问了N多高手都不知道怎么去解决,经过本人不懈的在google的查找,终于找到了解决方法,现共享给大家:)
修改注册表:
HKEY_CURRENT_USER\Control Panel\Keyboard 修改右边的InitialKeyboardIndicators的值:
0 - all indicators off
1 - Caps Lock on
2 - Num Lock on
4 - Scroll Lock on
如果该注册表项正常,则尝试修改如下:
HKEY_USERS\.DEFAULT\Control Panel\Keyboard\InitialKeyboardIndicators,值跟上面相同
前一天一朋友的SQL SERVER MSCS出现故障,一节点的SQL SERVER没办法Online,察看该节点OS的Event log,发现如下错误信息:
[sqsrvres] checkODBCConnectError: sqlstate = 01000; native error = 14; message = [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (PreLoginHandshake()).
[sqsrvres] ODBC sqldriverconnect failed
根据该错误信息,在google上查找,未果。打开MSCS管理工具,发现该节点上的其他Resource,如:Disk,IP Address,Network Name都是Online的,但就是跟sql有关的resource offline…初步估计是该节点的sql server有问题,试着将其切换至另一节点,发现可以online…这样似乎证实了刚才的判断…
既然是该节点的sql server有问题,那干脆将该节点的sql server程序文件重新安装一下,步骤如下:
1.将两边的Cluster service,sql server service停掉
2.为预防万一,将该节点的sql server文件夹改名备份
3.copy另一节点之sql server文件夹至本节点对应目录
4.将两边的cluster service 启动
结果更糟,两边的sql server service都无法起来了!
赶紧察看OS Event log,发现了新的error,如下:
[sqsrvres] checkODBCConnectError: sqlstate = 08001; native error = 14; message = [Microsoft][ODBC SQL Server Driver][DBNETLIB]Encryption not supported on SQL Server
重点在Encryption not supported on SQL Server, 奇怪怎么会出现sql server上不支持加密的错误呢?然后看了一下是DBNETLIB产生的错误,这不就是TCP/IP协议客户端通信组件所使用的文件吗?赶紧在命令行下执行:cliconfg,画面如下:
看图上用红线圈起来的地方,果然发现有强制进行协议加密!将强制加密去掉,果然sql service起来了!再检查另一节点,也是同样的问题,这样问题得到了解决!
其实在检查的过程中发现在OS的Service里sql server的服务是运行的,那就说明sql server本身没问题,只是没办法用管理工具去管理而已,因为所有的管理工具都是要通过通信组件客户端去连接,所以该问题最后的诊断结果是通信组件客户端采用了TCP/IP协议,但SQL SERVER不支持在该协议上加密,所以导致通信失败!
今天一个同事问我如何实现SELECT时实现输出系列号,比如:
ID NAME
———– ——————-
1 sysobjects
2 sysindexes
3 syscolumns
4 systypes
5 syscomments
6 sysfiles1
7 syspermissions
8 sysusers
9 sysproperties
其中ID是SELECT的时候生成的。
我们知道 oracle 中有ROWNUM这个伪列(pseudocolumn),可以直接实现这个功能,如:
SELECT ROWNUM AS ID,TABLE_NAME FROM ALL_TABLES WHERE ROW<10;
ID TABLE_NAME
———- ——————————
1 DUAL
2 SYSTEM_PRIVILEGE_MAP
3 TABLE_PRIVILEGE_MAP
4 STMT_AUDIT_OPTION_MAP
5 AUDIT_ACTIONS
6 PSTUBTBL
7 ODCI_SECOBJ$
8 ODCI_WARNINGS$
9 DEF$_TEMP$LOB
在SQL SERVER中没有这样的功能,所以只能另想办法。察看了一下BookOnline,发现可以用IDENTITY函数和临时表来实现。关于IDENTITY函数,BookOnline是这样说明的:
IDENTITY(函数)
只用在带有 INTO table 子句的 SELECT 语句中,以将标识列插入到新表中。
语法
IDENTITY ( data_type [ , seed , increment ] ) AS column_name
参数
data_type
标识列的数据类型。标识列的有效数据类型可以是任何整数数据类型分类的数据类型(bit 数据类型除外),也可以是 decimal 数据类型。
seed
要指派给表中第一行的值。给每一个后续行指派下一个标识值,该值等于上一个 IDENTITY 值加上 increment 值。如果既没有指定 seed,也没有指定 increment,那么它们都默认为 1。
increment
用来添加到 seed 值以获得表中连续行的增量。
column_name
将插入到新表中的列的名称。
返回类型
返回与 data_type 相同的类型。
我们可以这样实现我们的功能,如下:
USE PUBS
SET NOCOUNT ON
SELECT IDENTITY(INT,1,1) AS ID,NAME INTO #TEMP FROM SYSOBJECTS
SELECT * FROM #TEMP
DROP TABLE #TEMP
SET NOCOUNT OFF
结果如下:
ID NAME
———– ———————————————–
1 authors
2 byroyalty
3 CK__authors__au_id__77BFCB91
4 CK__authors__zip__79A81403
5 CK__jobs__max_lvl__145C0A3F
6 CK__jobs__min_lvl__1367E606
7 CK__publisher__pub_i__7C8480AE
8 CK_emp_id
9 DF__authors__phone__78B3EFCA
10 DF__employee__hire_d__1FCDBCEB
11 DF__employee__job_id__1B0907CE
12 DF__employee__job_lv__1CF15040
13 DF__employee__pub_id__1DE57479
14 DF__jobs__job_desc__1273C1CD
15 DF__publisher__count__7D78A4E7
16 DF__titles__pubdate__023D5A04
17 DF__titles__type__00551192
18 discounts
19 employee
其实也可以这样实现:
USE PUBS
SET NOCOUNT ON
DECLARE @I INT
SET @I=0
SELECT 0 AS ID,NAME INTO #TEMP FROM SYSOBJECTS
UPDATE #TEMP SET @I=@I+1,ID=@I
SELECT * FROM #TEMP
DROP TABLE #TEMP
SET NOCOUNT OFF
结果如下:
ID name
———– ————————————————–
1 authors
2 byroyalty
3 CK__authors__au_id__77BFCB91
4 CK__authors__zip__79A81403
5 CK__jobs__max_lvl__145C0A3F
6 CK__jobs__min_lvl__1367E606
7 CK__publisher__pub_i__7C8480AE
8 CK_emp_id
9 DF__authors__phone__78B3EFCA
10 DF__employee__hire_d__1FCDBCEB
11 DF__employee__job_id__1B0907CE
12 DF__employee__job_lv__1CF15040
13 DF__employee__pub_id__1DE57479
14 DF__jobs__job_desc__1273C1CD
15 DF__publisher__count__7D78A4E7
16 DF__titles__pubdate__023D5A04
17 DF__titles__type__00551192
18 discounts
19 employee
结果一样,但相比较第一种方法简单,性能上也有很大的优势,第二种方法比较适合更新已经存在的TABLE里的ID字段,让其按照某种方式进行排序。
一同事碰到这样一个问题:用ORADIM创建SID成功,但是用SVRMGRL连接的时候报ORA-12560错误。其安装的 oracle 版本是 oracle Enterprise Edition 8.1.7,OS为Windows 2000。查了些资料,对于该问题可用如下方法检查:
1. 检查Terminal Service,看远程桌面是不是起因
2. 检查环境变量ORACLE_SID是否正确,包括注册表中的设定
3. 检查 oracle 服务是否启动
4. 检查LISTENER.ORA,TNSNAME.ORA等的机器名(IP地址)或者服务名是否正确
5. Netstat –a检查端口是否被占用
6. 检查注册表HKEY_LOCAL_MACHINE\Software\ oracle \Home0新增字符串USE_SHARED_SOCKET=TRUE, 重新启动服务
1.FTP的类型
1).Port FTP:
一般形式的FTP,首先会建立控制频道,默认值是21,也就是跟port 21建立联机,并透过此联机下达指令。其次,由FTP Server端会建
立数据传输频道,默认值为20,也就是跟port 20建立联机,透过port 20作数据的传输。
2). PASV FTP:
首先会建立控制频道。默认值是port 21,透过此频道下达指令。第二,由Client端做出传输的请求,包括数据传输port的数字。
2.设定VSFTPD(vsftpd.conf)
1). ACSII设定:
acsii_download_enable=YES/NO
管理员是否可用ASCII模式下载,默认值为NO
acsii_upload_enable=YES/NO
管理员是否可用ASCII模式上传,默认值为NO
2).个别使用者设定:
Chroot_list_enable=YES/NO
如果启动此项功能,所有的本机使用者登入均可进到根目录之外的数据夹,除了列在/etc/vsftpd.chroot_list之中的使用者之外,默认值
为NO
Userlist_enable=YES/NO
若启动此功能,将会读取/etc/vsftpd.user_list当中的使用者名称,此项功能可以在询问密码前就出现失败讯息,而不需要检验密码,默
认为NO
Userlist_deny=YES/NO
此选项只有在userlist_enable启动时才会被检验。如果将这个选项设为YES,则在/etc/vsftpd.user_listK中的使用者将无法登入,若设为
NO,则只有在/etc/vsftpd.user_list中的使用者才能登入,且此项功能可以在询问密码前就出现错误讯息,而不需要检验密码
User_config_dir
定义个别使用者设定文件所在的目录,例如定义user_config_dir=/etc/vsftpd/userconf,默认值无
3).欢迎语设定:
Dirmessage_enable=YES/NO
若启动该选项,使用者第一次进入一个目录时,会检查该目录下是否有.messager这个档案,若有,则会出现该档案的内容,通常这个档
案会设置欢迎话语,或是对该目录的说明,默认无
Banner_file
当使用者登入时,会显示此设定所在的档案内容,通常为欢迎话语成员说明,默认值无
Ftpd_banner
定义欢迎话语的字符串,预设无
4). 特殊安全设定:
Chroot_local_user=YES/NO
若设为YES,则所有本机的使用者都不可以切换到根目录以外的文件夹,预设为YES
Hide_ids=YES/NO
若启动此项功能,所有档案的拥有者与群组都为FTP,也就是使用者登入ls –al之类的指令,所看到的档案者跟群组均为FTP,默认为NO
Ls_recurse_enable=YES/NO
若启动该功能,则允许登入者使用ls –R这个指令,默认为NO
Write_enable=YES/NO
若选项可以控制FTP的指令是否允许更改file.system,如:STOR,DELE,RNFT,RNTO,MKD,RMD,APPE及SITE,预设为关闭
Setproctitle_enable=YES/NO
若启动该功能,vsftpd会将所有联机的状况以不同的process呈现出来,换句话说,使用ps –ef这类的指令就可以看到联机的状态,默认
NO
Tcp_wrappers=YES/NO
若启动,则会将vsftpd与tcp wrapper结合,也就是可以在/etc/hosts.allow与/etc/hosts.deny中定义可联机成员拒绝的来源地址
Pam_service_name=vsftpd
定义pam所使用的名称,预设为vsftpd
Secure_chroot_dir=/usr/share/empty
该选项必须指定一个空的文件夹且任何登入者都不能有写入的权限,当vsftpd不需要file system的权限时,就会将使用者限制在文件夹
中,默认值为/usr/share/empty
5).记录文件设定:
Xferlog_enable=YES/NO
若启动,上传与下载的信息将被完整记录在底下的xferlog_file所定义的档案中,预设为开启
Xferlog_file=/var/log/vsftpd.log
设定记录文件所在的位置
Xferlog_std_format=YES/NO
若启动,则记录文件将会写成xferlog的标准格式,默认关闭
6). 逾时设定:
Accept_timeout=60
接受建立联机的逾时设定,单位为秒,默认值60
Connect_timeout=60
响应port方式的数据联机的逾时设定,单位为秒,默认值60
Data_connection_timeout=300
建立数据联机的逾时设定,默认值300
Idle_session_timeout=300
发呆的逾时设定,若超出此时间没有数据的传输或是指令的输入,则会强制断线,单位为秒,默认值300
7).速率限制:
Anon_max_rate=0
匿名访问能使用的最大传输速度,单位为每秒多少bytes,0表示不限速
Local_max_rate=0
本机使用者所能使用的最大传输速度,单位为bytes/s,0表示不限速
8). 新增档案权限设定
Anon_umask=077
匿名登入者新增档案时的umask数值,默认077
File_open_mode=0666
上传档案的权限,与chmod所使用的数值相同,默认为0666
Local_umask=077
本机登入者新增档案时的umask数值,默认077
9).Port设定:
Connect_from_port_20=YES/NO
若设为YES,则强制ftp_data的数据传送port,默认值YES
Ftp_data_port=20
设定ftp数据联机所使用的port,默认值20
Listen_port=21
ftp server所使用的port
Pasv_max_port=0
建立资料联机所可以使用port范围的上界,0表示任意
Pasv_min_port=0
建立资料联机所可以使用port范围的上界,0表示任意
10).其它
Anon_root
匿名登入时,所登入的目录,默认值为无
Local_enable=YES/NO
启动此功能则允许本机使用者登入,默认为YES
Local_root
本机使用者登入时,将被更换到定义的目录下,默认值无
Text_userdb_names=YES/NO
当使用者登入后使用ls –al之类的指令查询该档案的管理权限时,预设会出现拥有者的ID,而不是该档案拥有者的名称,若希望出现名
称,则将之开启。
Pasv_enable=YES/NO
若设为NO,则不允许使用PASV的模式建立数据的联机,默认值为YES
11).更换档案所有权(针对匿名用户):
Chown_uploads=YES/NO
Chown_username=root
12).Guest设定:
Guest_enable=YES/NO 默认为NO
Guest_username=ftp
13). Anonymous设定
Anonymous_enable=YES/NO
No_anon_password=YES/NO
Anon_mkdir_write_enable=YES/NO
若设为YES,匿名登入者会被允许新增目录,当然匿名使用者必须要对上层目录的写入权,默认值NO
Anon_other_write_enable=YES/NO
若设为YES,匿名用户会被允许更多于上传与建立目录之外的权限,比如:删除或更名,默认值NO
Anon_upload_enable=YES/NO
若设为YES,匿名用户会被允许上传目录的权限
Anon_world_readable_only=YES/NO
若设为YES,匿名登入者会被允许下载可阅读的档案,默认YES
Ftp_username=ftp
匿名登入的使用者名称
Deny_email_enable=YES/NO
若启动该功能,则必须提供一个档案/etc/vsftpd.banner_emails,内容为email addess,若是匿名登入,则会要求输入email adderss,若
输入的email adderss在此档案内,则不允许联机,默认值为NO
14). Standalone选项
Listen=YES/NO
Listen_address=IP adderss
Max_clients=0 0表示不限速
Max_per_ip=0 0表示不限速
1.事务(Transaction):
事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为 ACID
(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务。
原子性(Atomicty)
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性(Consistency)
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事
务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链
表)都必须是正确的。
隔离性(Isolation)
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状
态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看
中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使
数据结束时的状态与原始事务执行的状态相同。
持久性(Durability)
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
2.启动事务
在 Microsoft® SQL Server™ 中,可以按显式、自动提交或隐性模式启动事务。
显式事务
通过发出 BEGIN TRANSACTION 语句显式启动事务。
自动提交事务
这是 SQL Server 的默认模式。每个单独的 Transact-SQL 语句都在其完成后提交。不必指定任
何语句控制事务。
隐性事务
通过 API 函数或 Transact-SQL SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设
置为打开。下一个语句自动启动一个新事务。当该事务完成时,再下一个 Transact-SQL 语句
又将启动一个新事务。
3.结束事务
可以使用 COMMIT 或 ROLLBACK 语句结束事务。
COMMIT
如果事务成功,则提交。COMMIT 语句保证事务的所有修改在数据库中都永久有效。COMMIT
语句还释放资源,如事务使用的锁。
ROLLBACK
如果事务中出现错误,或者用户决定取消事务,可回滚该事务。ROLLBACK 语句通过将数据返
回到它在事务开始时所处的状态,来恢复在该事务中所作的所有修改。ROLLBACK 还会释放由
事务占用的资源。
4.事务处理过程中的错误
如果服务器错误使事务无法成功完成,SQL Server 将自动回滚该事务,并释放该事务占用的所有
资源。如果客户端与 SQL Server 的网络连接中断了,那么当网络告知 SQL Server 该中断时,将
回滚该连接的所有未完成事务。如果客户端应用程序失败或客户计算机崩溃或重启,也会中断该连
接,而且当网络告知 SQL Server 该中断时,也会回滚所有未完成的连接。如果客户从该应用程序
注销,所有未完成的事务也会被回滚。
如果批处理中出现运行时语句错误(如违反约束),那么 SQL Server 中默认的行为将是只回滚产
生该错误的语句。可以使用 SET XACT_ABORT 语句改变该行为。在 SET XACT_ABORT ON 语句
执行之后,任何运行时语句错误都将导致当前事务自动回滚。编译错误(如语法错误)
不受 SET XACT_ABORT 的影响。
如果出现运行时错误或编译错误,那么程序员应该编写应用程序代码以便指定正确的操作
(COMMIT 或 ROLLBACK)。
5.事务编写指导方针
1).不要在事务处理期间要求用户输入。
2).在浏览数据时,尽量不要打开事务。
在所有预备的数据分析完成之前,不应启动事务。
3).保持事务尽可能地短。
在知道了必须要进行的修改之后,启动事务,执行修改语句,然后立即提交或回滚。只有在需
要时,才打开事务。
4).灵活地使用更低的事务隔离级别。
可以很容易地编写出许多使用授权读事务隔离级别的应用程序。并不是所有的事务都要求可串
行事务隔离级别。
5).灵活地使用更低的游标并发选项,如乐观并发选项。
在很少有可能并发更新的系统中,处理某个偶然的”别人在您读取数据后更改了该数据”错误的
开销,要比在读取数据时始终锁定行的开销小得多。
6).在事务中尽量使访问的数据量最小。
这样可以减少锁定的行数,从而减少事务之间的争夺。
Recent Comments: