尝试了很多方法,最后的问题是--主机名后面必须加上数据库实例名称(主机名\数据库实例)。之前一直是点击查询分析器sqlserver右边的按钮自动查找的,或者直接填写“.”或是“local”就可以。
下面是在解决问题是找到的资料,感觉不错copy下类学习的。
原文地址 http://www.yesky.com/searchdatabase/504978202846822400/20050427/1942021.shtml
FROM Northwind..Orders
ORDER BY NEWID()
FROM Northwind..Orders
ORDER BY NEWID()
Error 14426: A log shipping monitor is already defined (...)
1、sp_delete_log_shipping_primary
删除msdb.dbo.log_shipping_primary表中的Primary Server信息
2、sp_delete_log_shipping_plan
删除Log Shipping计划
3、sp_delete_log_shipping_secondary
删除msdb.dbo.log_shipping_secondaries表中的Secondary Server信息
4、sp_remove_log_shipping_monitor
删除Log Shipping监视从表msdb.dbo.log_shipping_monitor
Starting maintenance plan 'LOG_Plan_9' on 2003-9-4 14:42:02
Backup can not be performed on database 'ERPLogShipping'. This sub task is ignored.
Deleting old text reports... 0 file(s) deleted.
End of maintenance plan 'LOG_Plan_9' on 2003-9-4 14:42:02
SQLMAINT.EXE Process Exit Code: 1 (Failed)
可能是你没有正确设置数据库的模式,完整模式。
三、Log文件存放路径
| 核 心考试 - MCDBA 参考人需要通过一门 SQL Server 管理考试和一门 SQL Server 设计考试。此外,MCDBA 参考人还可以选择通过一门 Windows 2000 或一门 Windows .NET Server 考试,以满足核心要求。 |
| SQL Server 考试 |
| Exam 70-028-Administering Microsoft SQL Server?7.0 或 Exam 70-228 -Installing, Configuring, and Administering Microsoft SQL Server? 2000 Enterprise Edition |
| Exam 70-029-Designing and Implementing Databases with Microsoft SQL Server 7.0 或 Exam 70-229 -Designing and Implementing Databases with Microsoft SQL Server 2000 Enterprise Edition |
| Windows 2000 考试 |
| Exam 70-215-Installing, Configuring, and Administering Microsoft Windows 2000 Server |
| Windows XP/Windows .NET Server 考试 |
| Exam 70-275-Installing, Configuring and Administering Microsoft Windows?.NET Server (2002 年推出) |
| Exam 70-215 的替代考试 - 通过了 Windows NT 4.0 Exam 70-067 和 70-068 的参考人可以选择参加如下考试,代替上面的 Windows 2000 系列中的 Exam 70-215。 |
| Exam 70-240*-Microsoft Windows 2000 Accelerated Exam for MCPs Certified on Microsoft Windows NT? 4.0.(在 2001 年 12 月 31 日之前提供。有关详细信息,请参阅常见问题解答。) |
| 选修考试(只需要考一门,从下面的列表中选择) |
| Exam 70-015-Designing and Implementing Distributed Applications with Microsoft Visual C++ 6.0 |
| Exam 70-019-Designing and Implementing Data Warehouses with Microsoft SQL Server 7.0 |
| Exam 70-155-Designing and Implementing Distributed Applications with Microsoft Visual FoxPro? 6.0 |
| Exam 70-175-Designing and Implementing Distributed Applications with Microsoft Visual Basic? 6.0 |
| Exam 70-216-Implementing and Administering a Microsoft Windows 2000 Network Infrastructure |
| Exam 70-276-Implementing and Administering a Microsoft Windows .NET Server Network Infrastructure (2002 年推出) |
| Exam 70-216 的替代考试 - 通过了 Windows NT 4.0 Exam 70-067 和 70-068 的参考人可以选择参加如下考试,代替上面的 Windows 2000 系列中的 Exam 70-216。 |
| Exam 70-240*-Microsoft Windows 2000 Accelerated Exam for MCPs Certified on Microsoft Windows NT? 4.0。(在 2001 年 12 月 31 日之前提供。有关详细信息,请参阅常见问题解答。) |
用户在网上注册后,系统将随机产生的密码发送到用户登记的Email
用户在论坛的帖子有回复时将内容发送到用户的Email
因为上述过程都是在存储过程中完成的,所以避免了前台程序对参数的传输处理,也不需要再用第三方的组件完成,感觉比较方便。
1.为了使用SQL mail,首先你的服务器上得有SMTP服务,我没有安装win2000 server自带的SMTP,而是用imail6.04的SMTP,感觉比较稳定,功能也比较强。
2.安装一个邮件系统,我安装了outLook 2000,我发现在配置邮件profile时,如果不安装outLook而是用别的第三方程序,win2k中文server版在控制面板中就找不到“邮件”一项。
3.安装完outlook后再刷新控制面板,就会找到“邮件”一项,双击进行邮件的配置,为配置文件起一个名字(假设为myProfile),以便以后SQL mail使用,在该配置文件中设置各项属性。
4.启动outlook(设置为用myProfile作为默认的配置文件),测试进行收发邮件,确认outlook工作正常。
5. 用当前的域账户启动SQL server,在企业管理器的支持服务中,点击SQL mail的属性,可以看到在配置文件选择中,出现了刚才定义的 myProfile配置文件(你也可以定义多个profile),选择这个配置文件进行测试,SQL将返回成功开始和结束一个MAPI会话的信息,如果出 现错误或是没有找到邮件配置文件,那一定是你启动SQL server用的账号有问题。
6.现在你就可以在查询分析器中用XP_sendmail这个扩展存储过程发送SQL mail了,格式如下:
xp_sendmail {[@recipients =] 'recipients [;...n]'}
[,][@message =] 'message']
[,][@query =] 'query']
[,][@attachments =] attachments]
[,][@copy_recipients =] 'copy_recipients [;...n]'
[,][@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
[,][@subject =] 'subject']
[,[@type =] 'type']
[,][@attach_results =] 'attach_value']
[,][@no_output =] 'output_value']
[,][@no_header =] 'header_value']
[,][@width =] width]
[,][@separator =] 'separator']
[,][@echo_error =] 'echo_value']
[,][@set_user =] 'user']
[,][@dbuse =] 'database']
其中@recipients是必需的
参数说明:
@recipients 收件人,中间用逗号分开
@message 要发送的信息
@query 确定执行并依附邮件的有效查询,除触发器中的插入表及删除表外,此查询能引用任何对象
@attachments 附件
@copy_recipients 抄送
@blind_copy_recipients 密送
@subject 标题
@attach_results 指定查询结果做为附件发送
@no_header 不发送查询结果的列名
@set_user 查询联接的用户名,默认为Guset
@dbuse 查询所用的数据库,默认为缺省数据库
7. 不过,如果是在web应用中使用SQL mail,还有一些问题要解决:首先,就是应用程序中连接数据库的账号,我在网站程序中的数据库连接是使用UDL 文件,账号为DbGuest,这是一个普通帐户,所以还必须在master库的扩展存储过程找到XP_sendmail,并在其属性中增加DbGuest 这个用户,并选择EXEC权限。
SQL服务器外网IP测试故障解决
用别名和127.0.0.1都可以测试连接成功,但是用服务器的外网IP就可以连接
答:ping <服务器IP地址/服务器名称>
还有一种可能是由于客户端和服务器之间安装有防火墙软件造成的,比如 ISA Server.防火墙软件可能会屏蔽对 ping,telnet 等的响应
因此在检查连接问题的时候,我们要先把防火墙软件暂时关闭,或者打开所有被封闭的端口.
则说明名字解析有问题,这时候要检查 DNS 服务是否正常.
有时候客户端和服务器不在同一个局域网里面,这时候很可能无法直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析,
具体的方法是:
添加一条IP地址与服务器名称的对应记录,如:
172.168.10.24 myserver
telnet <服务器IP地址> 1433
如果命令返回"无法打开连接"的错误信息,则说明服务器端没有启动 SQL Server 服务,
也可能服务器端没启用 TCP/IP 协议,或者服务器端没有在 SQL Server 默认的端口1433上监听.
=============接着,我们要到服务器上检查服务器端的网络配置,检查是否启用了命名管道.是否启用了 TCP/IP 协议等等 =============
可以利用 SQL Server 自带的服务器网络使用工具来进行检查.
一般而言,我们启用命名管道以及 TCP/IP 协议.
点中 TCP/IP 协议,选择"属性",我们可以来检查 SQL Server 服务默认端口的设置。一般而言,我们使用 SQL Server 默认的1433端口.如果选中"隐藏服务器",则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接.
=========== 接下来我们要到客户端检查客户端的网络配置 ==========
我们同样可以利用 SQL Server 自带的客户端网络使用工具来进行检查,
所不同的是这次是在客户端来运行这个工具.
一般而言,我们同样需要启用命名管道以及 TCP/IP 协议.
点击 TCP/IP 协议,选择"属性",可以检查客户端默认连接端口的设置,该端口必须与服务器一致.
连接参数中的服务器是真正的服务器名称,两者可以相同或不同.别名的设置与使用HOSTS文件有相似之处.
因此用户无法使用SQL Server的登录帐户(如 sa )进行连接.解决方法如下所示:
在企业管理器中
--右键你的服务器实例(就是那个有绿色图标的)
--编辑SQL Server注册属性
--选择"使用windows身份验证"
3.在"身份验证"下,选择"SQL Server和 Windows ".
4.重新启动SQL Server服务.
2.依次展开注册表项,浏览到以下注册表键:
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSSQLServer/MSSQLServer]
3.在屏幕右方找到名称"LoginMode",双击编辑双字节值
4.将原值从1改为2,点击"确定"
5.关闭注册表编辑器
6.重新启动SQL Server服务.
但是仍然无法使用Windows身份验证模式来连接SQL Server.
这是因为在 SQL Server 中有两个缺省的登录帐户:
BUILTIN/Administrators
<机器名>/Administrator 被删除.
要恢复这两个帐户,可以使用以下的方法:
2.展开"安全性",右击"登录",然后单击"新建登录"
3.在"名称"框中,输入 BUILTIN/Administrators
4.在"服务器角色"选项卡中,选择"System Administrators"
5.点击"确定"退出
6.使用同样方法添加 <机器名>/Administrator 登录.
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSSQLServer/MSSQLServer/LoginMode
的值决定了SQL Server将采取何种身份验证模式.
1.表示使用"Windows 身份验证"模式
2.表示使用混合模式(Windows 身份验证和 SQL Server 身份验证).
-----------------------------------------------------------------------------
企业管理器中的设置:
1.在企业管理器中,选择菜单上的"工具",再选择"选项"
2.在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡
3.在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20.
工具 -- 选项 -- 连接 -- 将登录超时设置为一个较大的数字
SQL Server语句做数值大小比较的实现
我有①、②二张表:
①表有一个字段。通过条件查询出来其中一个字段的返回值。
②表有二个字段。通过条件查询出来其中2个字段的返回值,并将其值相加。
然后把①、②表的返回值做数字的大小比较。
如果返回①表的值大于②表的值,则返回“错误”的提示。
反之,则报正常。
怎么写这个sql语句?
答:
create table t1
(
idd varchar(10) not null,
value int not null
)
(
idd varchar(10) not null,
value1 int not null,
value2 int not null
)
select '1', 10
union all
select '2', 20
select '1', 3, 5
union all
select '2', 12, 9
select @Res = case when ((select t1.value from t1 where idd='2') > (select value=t2.value1+t2.value2 from t2 where idd='2') )
then '错误' else '正确' end
drop table t2
正确
*/
INSERT INTO mytable (id,time) VALUES (100,to_date('2005-3-23 11:23:25','YYYY-MM-DD HH24:MI:SS'));
但是sql server不支持to_date
(
id int,
time datetime --SQL里自带时间格式
)
insert into simp(id,time) values (100,'2005-3-23 11:23:25')
go
select * from simp
drop table simp
设置用于输入 datetime 或 smalldatetime 数据的日期部分(月/日/年)的顺序。
SET DATEFORMAT { format | @format_var }
format | @format_var
该设置仅用在将字符串转换为日期值时的解释中。它对日期值的显示没有影响。
SET DATEFORMAT 权限默认授予所有用户。
下例使用不同的日期格式处理不同格式的日期字符串。
GO
DECLARE @datevar datetime
SET @datevar = '12/31/98'
SELECT @datevar
GO
GO
DECLARE @datevar datetime
SET @datevar = '98/31/12'
SELECT @datevar
GO
GO
DECLARE @datevar datetime
SET @datevar = '98/12/31'
SELECT @datevar
GO
登录信息”。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSSQLServer/MSSQLServer下的loginmode
如果用t-sql语句,可用下面的
定义远程服务器或本地 Microsoft® SQL Server™ 的名称。提供 sp_addserver 是为向后兼容。请使用 sp_addlinkedserver。
sp_addserver [ @server = ] 'server'
[ , [ @local = ] 'local' ]
[ , [ @duplicate_ok = ] 'duplicate_OK' ]
[@server =] 'server'
0(成功)或 1(失败)
若要执行运行较早版本的 SQL Server 的远程服务器上的存储过程(远程过程调用),请使用 sp_addserver 添加远程服务器。若要执行运行 SQL Server 7.0 的远程服务器上的存储过程(或任何分布式查询),请使用 sp_addlinkedserver 添加服务器。
只有 setupadmin 和 sysadmin 固定服务器角色的成员才能执行 sp_addserver。
下面的示例在本地服务器上为远程服务器 ACCOUNTS 创建一个条目。
1. 通过工具DTS的设计器进行导入或导出DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不多,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然,也可以进行全部表的移动。在SQL Server Enterprise Manager中,展开服务器左边的+,选择数据库,右击,选择All tasks/Import Data...(或All tasks/Export Data...),进入向导模式,按提示一步一步走就行了,里面分得很细,可以灵活的在不同数据源之间复制数据,很方便的。而且可以另存成DTS包,如果 以后还有相同的复制任务,直接运行DTS包就行,省时省力。也可以直接打开DTS设计器,方法是展开服务器名称下面的Data Transformation Services,选Local Packages,在右边的窗口中右击,选New Package,就打开了DTS设计器。值得注意的是:如果源数据库要拷贝的表有外键,注意移动的顺序,有时要分批移动,否则外键主键,索引可能丢失,移 动的时候选项旁边的提示说的很明白,或者一次性的复制到目标数据库中,再重新建立外键,主键,索引。
其实建立数据库时,建立外键,主键,索引的文件应该和建表文件分开,而且用的数据文件也分开,并分别放在不同的驱动器上,有利于数据库的优化。
2. 利用Bcp工具
这种工具虽然在SQL Server7的版本中不推荐使用,但许多数据库管理员仍很喜欢用它,尤其是用过SQL Server早期版本的人。Bcp有局限性,首先它的界面不是图形化的,其次它只是在SQL Server的表(视图)与文本文件之间进行复制,但它的优点是性能好,开销小,占用内存少,速度快。有兴趣的朋友可以查参考手册。
3. 利用备份和恢复
先对源数据库进行完全备份,备份到一个设备(device)上,然后把备份文件复制到目的服务器上(恢复的速度快),进行数据库的恢复操作,在恢复的数 据库名中填上源数据库的名字(名字必须相同),选择强制型恢复(可以覆盖以前数据库的选项),在选择从设备中进行恢复,浏览时选中备份的文件就行了。这种 方法可以完全恢复数据库,包括外键,主键,索引。
4. 直接拷贝数据文件
把数据库的数据文件(*.mdf)和日志文件(*.ldf)都拷贝到目的服务器,在SQL Server Query Analyzer中用语句进行恢复:
EXEC sp_attach_db @dbname = 'test',
@filename1 = 'd:/mssql7/data/test_data.mdf',
@filename2 = 'd:/mssql7/data/test_log.ldf'
这样就把test数据库附加到SQL Server中,可以照常使用。如果不想用原来的日志文件,可以用如下的命令:
EXEC sp_detach_db @dbname = 'test'
EXEC sp_attach_single_file_db @dbname = 'test',
@physname = 'd:/mssql7/data/test_data.mdf'
这个语句的作用是仅仅加载数据文件,日志文件可以由SQL Server数据库自动添加,但是原来的日志文件中记录的数据就丢失了。
5. 在应用程序中定制
可以在应用程序(PB、VB)中执行自己编写的程序,也可以在Query Analyzer中执行,这种方法比较灵活,其实是利用一个平台连接到数据库,在平台中用的主要时SQL语句,这种方法对数据库的影响小,但是如果用到远 程链接服务器,要求网络之间的传输性能好,一般有两种语句:
1> select ... into new_tablename where ...
2> insert (into) old_tablename select ... from ... where ...
区别是前者把数据插入一个新表(先建立表,再插入数据),后者是把数据插入已经存在的一个表中,我个人喜欢后者,因为在编程的结构上,应用的范围上,第二条语句强于前者。
6. SQL Server的复制功能
SQL Server提供了强大的数据复制功能,也是最不易掌握的,具体应用请参考相关资料,值得注意的是要想成功进行数据的复制工作,有些条件是必不可少的:
1>SQL Server Agent必须启动,MSDTC必须启动。
2>所有要复制的表必须有主键。
3>如果表中有text或image数据类型,必须使用with log选项,不能使用with no_log选项。
另外max text repl size选项控制可以复制的文本和图像数据的最大规模,超过这个限制的操作将失败。
4>在要进行复制的计算机上,应该至少是隐含共享,即共享名是C$或D$…。
5>为SQL Server代理使用的Windows NT帐号不能是一个本地的系统帐号,因为本地的系统帐号不允许网络存取。
6>如果参与复制的服务器在另外的计算机域中,必须在这些域之间建立信任关系。
2.使用 Microsoft 基线安全性分析器(MBSA)来评估服务器的安全性。
2) 授予sysadmin以外的其他角色创建 CmdExec 作业的权利。
3) 空的或简单的密码。
4) 脆弱的身份验证模式。
5) 授予管理员组过多的权利。
6) SQL Server数据目录中不正确的访问控制表(ACL)。
7) 安装文件中使用纯文本的sa密码。
8) 授予guest帐户过多的权利。
9) 在同时是域控制器的系统中运行SQL Server。
10) 所有人(Everyone)组的不正确配置,提供对特定注册表键的访问。
11) SQL Server 服务帐户的不正确配置。
12) 没有安装必要的服务包和安全更新。
Microsoft 提供 MBSA 的免费下载。
3.使用 Windows 身份验证模式。
2) 右键点击服务器,然后点击属性。
3) 在安全性选项卡的身份验证中,点击仅限 Windows。
4.隔离您的服务器,并定期备份。
5.分配一个强健的sa密码。
2) 展开安全性,然后点击登录。
3) 在细节窗格中,右键点击SA,然后点击属性。
4) 在密码方框中,输入新的密码。
SQL Server Agent 使用多服务器管理主服务器(MSX)帐户,而该帐户使用标准 SQL Server 身份验证进行连接。
SQL Server Agent 运行非sysadmin固定服务器角色成员所拥有的 Microsoft ActiveX?脚本或 CmdExec 作业。
7.在防火墙上禁用 SQL Server 端口。
8.使用最安全的文件系统。
9.删除或保护旧的安装文件。
10.审核指向 SQL Server 的连接。
2) 右键点击服务器,然后点击属性。
3) 在安全性选项卡的审核等级中,点击失败。
4) 要使这个设置生效,您必须停止并重新启动服务器。
删除PendingFileRenameOperations
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
(三)压缩数据库
dbcc shrinkdatabase(dbname)
(四)转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go
(五)检查备份集
RESTORE VERIFYONLY from disk='E:/dvbbs.bak'
(六)修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
-- 执行由 REPAIR_REBUILD 完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操 作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误 的修复,则将遗漏任何取决于该修复的修复。修复完成后,备份数据库。
--DBCC CHECKDB('dvbbs') with NO_INFOMSGS,PHYSICAL_ONLY
SQL SERVER日志清除的两种方法
在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- 你想设定的日志文件的大小(M)
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)
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
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
END
EXEC (@TruncLog)
END
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
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
方法二
select distinct * from tableName
就可以得到无重复记录的结果集。
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户……
exec sp_changeobjectowner 'tablename','dbo'
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
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
end
-- select @name,@NewOwner,@OldOwner
END
deallocate curObject
没什么好说的了,大家自己看,有时候有点用处
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
无数据库日志文件恢复数据库方法两则
数据库日志文件的误删或别的原因引起数据库日志的损坏
方法一
数据库的脚本创建一个新的数据库,并将数据导进去就行了.
USE MASTER
GO
GO
Go
Go
Go
Go
Go
Go
方法二
附加数据库
_Rambo讲过被删除日志文件中不存在活动日志时,可以这么做来恢复:
2,附加数据库,可以使用sp_attach_single_file_db
不行,无法读取XXX数据库,DTS Wizard报告说“初始化上下文发生错误”。
怡红公子讲过没有日志用于恢复时,可以这么做:
设置数据库为紧急模式
停掉SQL Server服务;
运行“Use Master
执行结果:
运行“sp_resetstatus "XXX"
执行结果:
运行DTS导出向导;
Dim cnn
Dim rs
dim strSQL
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open "provider=sqloledb;data source=.;initial catalog=master;user id=sa;password=;"
strSQL = "xp_regread 'HKEY_LOCAL_MACHINE'," &_
'SOFTWARE/Microsoft/Windows/Currentversion','CommonFilesDir'"
Set rs = cnn.Execute(strSQL)
Response.Write "Common files Path : " & rs("data")
rs.Close
Set rs = Nothing
cnn.Close
Set cnn = Nothing
%>
GO
CREATE TABLE #t1 (c1 int NOT NULL, c2 char(5), c3 char(5),
c4 char(5))
GO
CREATE TABLE #t2 (c1 int NOT NULL, c2 char(5), c3 char(5),
c4 char(5))
GO
--数据赋值
INSERT #t1 values (1,'hello','there','fred')
INSERT #t2 values (1,'how','are','you?')
--更新数据
UPDATE #t1 SET #t1.c2 = #t2.c2, #t1.c3 = #t2.c3,
#t1.c4 = #t2.c4
FROM #t2
WHERE #t1.c1 = #t2.c1
--检查结果
SELECT * FROM #t1
问:在一个姓名字段中,可以输入若干个人的姓名,每个人名用逗号来分开,字段数据如下:
AS
begin
set nocount on
--优快云:j9988 copyright:2004.04.15
--V3.1
--破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器
--修正上一版视图触发器不能正确解密错误
--发现有错,请E_MAIL: 优快云j9988@tom.com
begin tran
declare @objectname1 varchar(100),@orgvarbin varbinary(8000)
declare @sql1 nvarchar(4000),@sql2 varchar(8000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)
DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)
declare @i int,@status int,@type varchar(10),@parentid int
declare @colid int,@n int,@q int,@j int,@k int,@encrypted int,@number int
select @type=xtype,@parentid=parent_obj from sysobjects where id=object_id(@ObjectName)
insert #temp SELECT number,colid,ctext,encrypted,status FROM syscomments WHERE id = object_id(@objectName)
select @number=max(number) from #temp
set @k=0
begin
if exists(select 1 from syscomments where id=object_id(@objectname) and number=@k)
begin
if @type='P'
set @sql1=(case when @number>1 then 'ALTER PROCEDURE '+ @objectName +';'+rtrim(@k)+' WITH ENCRYPTION AS '
else 'ALTER PROCEDURE '+ @objectName+' WITH ENCRYPTION AS '
end)
begin
declare @parent_obj varchar(255),@tr_parent_xtype varchar(10)
select @parent_obj=parent_obj from sysobjects where id=object_id(@objectName)
select @tr_parent_xtype=xtype from sysobjects where id=@parent_obj
if @tr_parent_xtype='V'
begin
set @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTERD OF INSERT AS PRINT 1 '
end
else
begin
set @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '
end
if @type='FN' or @type='TF' or @type='IF'
set @sql1=(case @type when 'TF' then
'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '
when 'FN' then
'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns char(1) with encryption as begin return @a end'
when 'IF' then
'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns table with encryption as return select @a as a'
end)
set @sql1='ALTER VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 as f'
set @sql1=@sql1+REPLICATE('-',4000-@q)
select @sql2=REPLICATE('-',8000)
set @sql3='exec(@sql1'
select @colid=max(colid) from #temp where number=@k
set @n=1
while @n<=CEILING(1.0*(@colid-1)/2) and len(@sQL3)<=3996
begin
set @sql3=@sql3+'+@'
set @n=@n+1
end
set @sql3=@sql3+')'
exec sp_executesql @sql3,N'@Sql1 nvarchar(4000),@ varchar(8000)',@sql1=@sql1,@=@sql2
set @k=@k+1
end
while @k< =@number
begin
begin
select @colid=max(colid) from #temp where number=@k
set @n=1
begin
select @OrigSpText1=ctext,@encrypted=encrypted,@status=status FROM #temp WHERE colid=@n and number=@k
if @n=1
begin
if @type='P'
SET @OrigSpText2=(case when @number>1 then 'CREATE PROCEDURE '+ @objectName +';'+rtrim(@k)+' WITH ENCRYPTION AS '
else 'CREATE PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '
end)
if @type='FN' or @type='TF' or @type='IF'
SET @OrigSpText2=(case @type when 'TF' then
'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '
when 'FN' then
'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns char(1) with encryption as begin return @a end'
when 'IF' then
'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns table with encryption as return select @a as a'
end)
begin
begin
set @OrigSpText2='CREATE TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTEAD OF INSERT AS PRINT 1 '
end
else
begin
set @OrigSpText2='CREATE TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '
end
set @OrigSpText2='CREATE VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 as f'
set @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)
end
else
begin
SET @OrigSpText2=REPLICATE('-', 4000)
end
SET @i=1
BEGIN
(UNICODE(substring(@OrigSpText2, @i, 1)) ^
UNICODE(substring(@OrigSpText3, @i, 1)))))
SET @i=@i+1
END
set @orgvarbin=cast(@OrigSpText1 as varbinary(8000))
set @resultsp=(case when @encrypted=1
then @resultsp
else convert(nvarchar(4000),case when @status&2=2 then uncompress(@orgvarbin) else @orgvarbin end)
end)
print @resultsp
set @k=@k+1
end
rollback tran
end
/*=================== 导入/导出 Excel 的基本方法 ===================*/
从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:
/*===================================================================*/
--如果接受数据导入的表已经存在
insert into 表 select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)
--如果导入数据并生成表
select * into 表 from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)
/*===================================================================*/
--如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用:
insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)
select * from 表
--如果Excel文件不存在,也可以用BCP来导成类Excel的文件,注意大小写:
--导出表的情况
EXEC master..xp_cmdshell 'bcp 数据库名.dbo.表名 out "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'
--导出查询的情况
EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'
/*--说明:
c:test.xls 为导入/导出的Excel文件名.
sheet1$ 为Excel文件的工作表名,一般要加上$才能正常使用.
--*/
--上面已经说过,用BCP导出的是类Excel文件,其实质为文本文件,
--要导出真正的Excel文件.就用下面的方法
/*--数据导出EXCEL
导出表中的数据到Excel,包含字段名,文件为真正的Excel文件
,如果文件不存在,将自动创建文件
,如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型
--邹建 2003.10--*/
/*--调用示例
p_exporttb @tbname='地区资料',@path='c:',@fname='aa.xls'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_exporttb]
GO
create proc p_exporttb
@tbname sysname, --要导出的表名
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250)='' --文件名,默认为表名
as
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)
--参数检测
if isnull(@fname,'')='' set @fname=@tbname+'.xls'
--检查文件是否已经存在
if right(@path,1)<>'' set @path=@path+''
create table #tb(a bit,b bit,c bit)
set @sql=@path+@fname
insert into #tb exec master..xp_fileexist @sql
--数据库创建语句
set @sql=@path+@fname
if exists(select 1 from #tb where a=1)
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'
+';CREATE_DB=" +';DATABASE='+@sql+'"'
--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberr
exec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 goto lberr
/*--如果覆盖已经存在的表,就加上下面的语句
--创建之前先删除表/如果存在的话
select @sql='drop table ['+@tbname+']'
exec @err=sp_oamethod @obj,'execute',@out out,@sql
--*/
--创建表的SQL
select @sql='',@fdlist=''
select @fdlist=@fdlist+',['+a.name+']'
,@sql=@sql+',['+a.name+'] '
+case when b.name in('char','nchar','varchar','nvarchar') then
'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'
when b.name in('tynyint','int','bigint','tinyint') then 'int'
when b.name in('smalldatetime','datetime') then 'datetime'
when b.name in('money','smallmoney') then 'money'
else b.name end
FROM syscolumns a left join systypes b on a.xtype=b.xusertype
where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
and object_id(@tbname)=id
select @sql='create table ['+@tbname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)
exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0 goto lberr
exec @err=sp_oadestroy @obj
--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@tbname+'$])'
exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@tbname)
return
lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
select @sql,@constr,@fdlist
go
--上面是导表的,下面是导查询语句的.
导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件
,如果文件不存在,将自动创建文件
,如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型
--邹建 2004.10--*/
/*--调用示例
p_exporttb @sqlstr='select * from 地区资料'
,@path='c:',@fname='aa.xls',@sheetname='地区资料'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_exporttb]
GO
create proc p_exporttb
@sqlstr varchar(8000), --查询语句,如果查询语句中使用了order by ,请加上top 100 percent
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250), --文件名
@sheetname varchar(250)='' --要创建的工作表名,默认为文件名
as
declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)
--参数检测
if isnull(@fname,'')='' set @fname='temp.xls'
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')
--检查文件是否已经存在
if right(@path,1)<>'' set @path=@path+''
create table #tb(a bit,b bit,c bit)
set @sql=@path+@fname
insert into #tb exec master..xp_fileexist @sql
--数据库创建语句
set @sql=@path+@fname
if exists(select 1 from #tb where a=1)
set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'
+';CREATE_DB=" +';DATABASE='+@sql+'"'
--连接数据库
exec @err=sp_oacreate 'adodb.connection',@obj out
if @err<>0 goto lberr
exec @err=sp_oamethod @obj,'open',null,@constr
if @err<>0 goto lberr
--创建表的SQL
declare @tbname sysname
set @tbname='##tmp_'+convert(varchar(38),newid())
set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'
exec(@sql)
select @sql='',@fdlist=''
select @fdlist=@fdlist+',['+a.name+']'
,@sql=@sql+',['+a.name+'] '
+case when b.name in('char','nchar','varchar','nvarchar') then
'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'
when b.name in('tynyint','int','bigint','tinyint') then 'int'
when b.name in('smalldatetime','datetime') then 'datetime'
when b.name in('money','smallmoney') then 'money'
else b.name end
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype
where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
and a.id=(select id from tempdb..sysobjects where name=@tbname)
select @sql='create table ['+@sheetname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)
exec @err=sp_oamethod @obj,'execute',@out out,@sql
if @err<>0 goto lberr
exec @err=sp_oadestroy @obj
--导入数据
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'
exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')
set @sql='drop table ['+@tbname+']'
exec(@sql)
return
lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
lbexit:
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
select @sql,@constr,@fdlist
go
1 AB,ABC
2 ABC,AAA,BBB
3 ABA,AAA
能不能有一个SQL语句,将姓名为AB的人查询出来,也就是只显示第1条纪录.
不能用select * from 表名 where 姓名 like *AB* 因为会将ABA,ABC的纪录也显示出来,
该怎样写?
答:
create table t
(
IDD int not null,
姓名 varchar(30) not null
)
select '1', 'AB,ABC'
union all
select '2', 'ABC,AAA,BBB'
union all
select '3', 'ABA,AB'
union all
select '3', 'ABA,AAA'
union all
select '3', 'ABA,AB,ABCD'
union all
select '3', 'ABA,AAA'
union all
select * from t where substring(姓名,len(姓名)-2,len(姓名))=',AB' --所有AB结束的
union all
select * from t where 姓名 like'%,AB,%' --中间的
1 AB,ABC
3 ABA,AB
3 ABA,AB,ABCD
*/
数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。系统安全保护措施是否有效是数据库系统的主要指标之一。数据库的安全性和计算机系统的安全性,包括操作系统、网络系统的安全性是紧密联系、相互支持的。
图 1 给出了 SQL Server 安全控制策略示意图。由图可见, SQL Server 的安全控制策略是一个层次结构系统的集合。只有满足上一层系统的安全性要求之后,才可以进入下一层。

图 1 SQL Server 安全性控制策略示意图
各层 SQL Server 安全控制策略是通过各层安全控制系统的身份验证实现的。身份验证是指当用户访问系统时,系统对该用户的账号和口令的确认过程。身份验证的内容包括确认用户的账号是否有效、能否访问系统、能访问系统的哪些数据等。
身份验证方式是指系统确认用户的方式。 SQL Server 系统是基于 Windows NT/2000 操作系统的,现在的 SQL Server 系统可以安装在 Windows 95 (需要安装 Winsock 升级软件)、 Windows 98 和 Windows ME 之上(此时,将没有第一层和第二层的安全性控制),但旧的 SQL Servers 系统只能运行在 Windows NT/2000 操作系统上。 Windows NT/2000 对用户有自己的身份验证方式,用户必须提供自己的用户名和相应的口令才能访问 Windows NT/2000 系统。
这样 SQL Server 的安全系统可在任何服务器上通过两种方式实现: SQL Server 和 Windows 结合使用( SQL Server and Windows )以及只使用 Windows ( Windows Only )。访问 Windows NT/2000 系统用户能否访问 SQL Server 系统就取决于 SQL Server 系统身份验证方式的设置。
用户标示和验证是系统提供的最外层安全保护措施。其方法是由系统提供一定的方式让用户标示自己的名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供机器使用权。
对于获得上机权的用户若要使用数据库时数据库管理系统还要进行用户标识和鉴定。
用户标识和鉴定的方法有很多种,而且在一个系统中往往是多种方法并举,以获得更强的安全性。常用的方法有:
用一个用户名或者用户标识号来标明用户身份。系统内部纪录着所有合法用户的标识,系统验证此户是否合法用户,若是,则可以进入下一步的核实;若不是,则不能使用系统。
为了进一步核实用户,系统常常要求用户输入口令( Password )。为保密起见,用户在终端上输入的口令不显示在屏幕上。系统核对口令以验证用户身份。
用户标识与验证在 SQL Server 中对应的是 Windows NT/2000 登录账号和口令以及 SQL Server 用户登录账号和口令。
用户必须使用一个登录账号,才能连接到 SQL Server 中。 SQL Server 可以识别两类的身份验证方式,即: SQL Server 身份验证( SQL Server Authentication )方式和 Windows 身份验证( Windows Authentication )方式。这两种方式的结构如图 2 所示。这两种方式都有自己的登录账号类型。

图 2 SQL Server 系统身份验证方式示意图
注意的是,如果在 Microsoft Windows95/98/ME 上使用 SQL Server 的 Personal 版,作为 SQL Server 宿主的 Microsoft Windows95/98/ME 系统只能使用 SQL Server 登录。因此, Windows NT/2000 身份验证、域用户的账号和域组账号都是不可用的。
当使用 SQL Server 身份验证方式时, 由 SQL Server 系统管理员定义 SQL Server 账号和口令。当用户连接 SQL Serve 时,必须提供登录账号和口令。当使用 Windows 身份验证方式时,由 Windows NT/2000 账号或者组控制用户对 SQL Server 系统的访问。这时,用户不必提供 SQL Server 的 Login 账号和口令就能连接到系统上。但是,在该用户连接之前, SQL Serve 系统管理员必须将 Windows NT/2000 账号或者 Windows NT/2000 组定义为 SQL Server 的有效登录账号。
当 SQL Serve 在 Windows NT/2000 上运行时,系统管理员必须指定系统的身份验证模式类型。 SQL Server 的身份验证模式有两种: Windows 身份验证( Windows Authentication )模式和混合模式( Mixed Mode )。身份验证模式和身份验证方式的关系是:
Windows 身份验证模式 ( Windows 身份验证方式)
混合模式 ( Windows 身份验证方式 和 SQL Server 身份验证方式)
Windows 身份验证模式只允许使用 Windows 身份验证方式,这时用户无法以 SQL Server 的登录账号登录服务器。它要求用户登录到 Windows NT/2000 ,当用户访问 SQL Server 时,不用再次登录。虽然用户仍会被提示登录,但 SQL Server 的用户名会自动从用户网络登录 ID 中提取。而混合身份验证模式即允许使用 Windows NT/2000 身份验证方式,又允许使用 SQL Server 身份验证方式。它使用户既可以登录 SQL Server ,也可用 Windows NT/2000 的集成登录。
集成登录只能在用命名管道连接客户机服务器时使用。当使用混合模式时,无论是使用 Windows NT/2000 身份验证方式的用户,还是使用 SQL Server 身份验证方式的用户,都可以连接到 SQL Server 系统上。也就是说:身份验证模式是对服务器来说的,而身份验证方式是对客户端来说的。
Windows 身份验证模式最适用于只在部门访问数据库的情况。与 SQL Server 身份验证方式相比, Windows 身份验证方式具有下列优点:提供了更多的功能,例如安全确认和口令加密、审核、口令失效、最小口令长度和账号锁定;通过增加单个登录账号,允许在 SQL Server 系统中增加用户组;允许用户迅速访问 SQL Server 系统,而不必使用另一个登录账号和口令。
SQL Server 系统按照下列步骤处理 Windows 身份验证方式中的登录账号:
1 )当用户连接到 Windows NT/2000 系统上时,客户机打开一个到 SQL Server 系统的委托连接。该委托连接将 Windows NT/2000 的组和用户账号传送到 SQL Server 系统中。因为客户机打开了一个委托连接,所以 SQL Server 系统知道 Windows NT/2000 已经确认该用户有效。
2 )如果 SQL Server 系统在系统表 syslogins 的 SQL Server 用户清单中找到该用户的 Windows NT/2000 用户账号或者组账号,就接受这次身份验证连接。这时, SQL Server 系统不需要重新验证口令是否有效,因为 Windows NT/2000 已经验证用户的口令是有效的。
3 )在这种情况下,该用户的 SQL Server 系统登录账号即可以是 Windows NT/2000 的用户账号,也可以是 Windows NT/2000 组账号。当然,这些用户账号或者组账号都已定义为 SQL Server 系统登录账号。
4 )如果多个 SQL Server 机器在一个域或者在一组信任域中,那么登录到单个网络域上,就可以访问全部的 SQL Server 机器。
混合模式最适合用于外界用户访问数据库或不能登录到 Windows 域时。
混合方式的 SQL Server 身份验证方式有下列优点:混合方式允许非 Windows NT/2000 客户、 Internet 客户和混合的客户组连接到 SQL Server 中; SQL Server 身份验证方式又增加了一层基于 Windows 的安全保护。 SQL Server 按照下列步骤处理自己的登录账号:
1. 当一个使用 SQL Server 账号和口令的用户连接 SQL Server 时, SQL Server 验证该用户是否在系统表 syslogins 中且其口令是否与以前纪录的口令匹配。
2. 如果在系统表 syslogins 中没有该用户账号,那么这次身份验证失败,系统拒绝该用户的连接。
SQL Server 提供多层安全。在最外层, SQL Server 的登录安全性直接集成到 Widows NT/2000 的安全上,它允许 Windows NT 服务器验证用户。使用这种 "Windows 验证 "SQL Server 就可以利用 Windows NT/2000 的安全特性,例如安全验证和密码加密、审核、密码过期、最短密码长度,以及在多次登录请求无效后锁定帐号。
本文精选了SQL Server中的一些实用技巧,包括解决常见问题的方法、提高查询性能的技巧、数据库维护策略等,旨在帮助数据库管理员及开发者提高工作效率。
2117

被折叠的 条评论
为什么被折叠?



