提高记忆力 点击: 2015-04-10
SqlServer数据同步之日志同步
SQL Server 2005相对于SQL Server 2000来说,无论是性能还是功能都有一个相当大的提高,甚至可以用“革命”来形容这一次升级。SQL Server 2005使 SQL Server 跻身于企业级数据库行列。在数据高可用性方面,SQL Server 2005为用户提供了数据镜像、复制、故障转移群集、日志传送功能。本文向读者简单介绍SQL Server 2005日志传送功能。
一、 日志传送简介
日志传送一般有主服务器、辅助服务器、监视服务器组成(见图1)。主服务器一般是存储生产数据库的服务器,辅助服务器用来存储主服务器上生产数据库的副 本,监视服务器用来记录日志传送的所有细节服务器,监视服务器是可选的。日志传送是将主服务器的生产数据库的事务日志复制到辅助服务器并在辅助服务器还 原,从而实现主服务器生产数据库和辅助服务器数据库副本数据的一致。
图1
日志传送要求主服务器生产数据库的日志恢复模式是完全或者大容量日志模式,将数据库切换为简单恢复模式会导致日志传送停止工作。辅助服务器是用
来保存主 数据库的最新备份的服务器。一台辅助服务器可以包含多台不同主服务器中数据库的备份副本。例如,某个部门可能有五台服务器,每台服务器都运行关键数据库系 统。在这种情况下,可以只使用一台辅助服务器,而不必使用五台单独的辅助服务器。五个主系统上的备份都可以加载到这个备份系统中,从而减少所需的资源数量 并节省开支。监视服务器应独立于主服务器和辅助服务器,以避免由于主服务器或辅助服务器的丢失而丢失关键信息和中断监视。一台监视服务器可以监视多个日志 传送配置。在这种情况下,使用该监视服务器的所有日志传送配置将共享一个警报作业。
日志传送操作由四个操作组成:备份作业、复制作业、还原作业和警报作业。 •备份作业,日志传送在主服务器实例上为每个主数据库创建一个备份作业。它执行备份操作,将历史记录信息记录到本地服务器和监视服务器上,并删除旧备份文件和历史记录信息。
•复制作业,日志传送在辅助服务器实例上为每个日志传送配置创建一个复制作业。此作业将备份文件从主服务器复制到辅助服务器,并在辅助服务器和监视服务器上记录历史记录信息。
•还原作业,日志传送在辅助服务器实例上为每个日志传送配置创建一个还原作业。此作业将复制的备份文件还原到辅助数据库。它将历史记录信息记录在本地服务器和监视服务器上,并删除旧文件和旧历史记录信息。
•警报作业,如果使用了监视服务器,将在警报监视器服务器实例上创建一个警报作业。此警报作业由使用监视器服务器实例的所有日志传送配置中的主数据库和 辅助数据库所共享。对警报作业进行的任何更改(例如,重新计划作业、禁用作业或启用作业)会影响所有使用监视服务器的数据库。
二、配置实例
1、准备工作
首先确保生产数据库日志恢复模式为大容量日志模式或者是完整模式。若恢复模式为简单,则在设置“将此数据启用为日志传送中配置中的主数据库”时出错。
其次规划事务日志存放目录,存放事务日志目录要求有两个,一个用来存放主服务器备份,一个用来存放辅助服务器还原的备份文件。这两个目录可以分别建在主 服务器和辅助服务器上,但是更好的做法是把主服务器的备份目录放在某文件服务器上,这样可以减少主服务器的I/O读写次数。
修改主服务 器和辅助服务器上的 SQL AGGENT启动账号。在主服务器上,定时备份事务日志是通过SQL作业来完成,确保启动SQL AGENT账号能够访问用来存放由备份作业产生的事务日志目录。辅助服务器上复制作业和备份作业同样是由SQL AGENT 作业完成,确保的启动SQL AGENT账号要求能够访问主服务器
存放事务日志的目录,同时也要求能够访问由复制作业复制过来用来存放辅助服务器还原的事务日志的目录。
2、配置步骤
为了说明配置步骤,笔者在同一台机器上装了二个实例:SERVER01,SRVER02,笔者的机器名称为jeffery,规划了三个文件夹, C:DataBackup用为存放主数据库的完整备份,用于初始化辅助服务器,这个文件夹要求辅助服务器的启动SQL AGENT账号能访问;C:PrimaryData用来存放由备份作业备份出来的主服务器的事务日志,设置成共享文件夹,这个文件夹要求辅助服务器的启动 SQL AGENT账号能访问;C:SecondaryData用来存放由辅助服务器上复制作业从主服务器的复制过来的主服务器的事务日志,也设置成共享的,这个 文件夹要求辅助服务器的启动SQL AGENT账号能访问(如图2所示)。
图2
将SERVER01设置成为主服务器,主数据库为LOG_TRANSFER。将SERVER02设置成为辅助服务器。
第一步:备份主数据库到C:DataBackup LOG_TRANSFER.BAK(主数据库的完整备份)。
第二步:在 SERVER01的LOG_TRANSFER数据库上单击右键,选择”任务”中的“传送事务日志”,打开事务日志传送配置窗口,单击“将此数据库启用为日志传送配置中的主数据库 ”(如图3所示)。
图3
第三步:配置主服务器的日志备份,单击“备份设置按钮”,打开备份设置窗口。在这里需要设置主服务器备份的路径,在前面的说明中已提 到,
primarydata目录是用来存放主服务器的事务日志,并且设置为共享。所以在备份文件夹的网络路径中输入 jefferyPrimaryData,第二个红方框要求输入这个文件的本地路径。
图4
第四步:设置备份作业。单击“计划”按钮。单出如图5的对话框,在这个对话框中可以设置执行的间隔,这里设置成2分钟。你还可以设置某一天的开始
SQL作业
实验九 SQL Server2005的安全管理(实验报告)
一、目的
1.了解SQL Server 2005的安全架构。
2.掌握以服务器为主体的安全管理的基本操作。
3.掌握以数据库为主体的安全管理的基本操作。
4.掌握对用户进行权限管理的常用操作。
二、实验环境
SQL2005。
三、实验原理
1.掌握SQL Server 2005的安全管理。
四、实验报告
完成书上上机练习题。(利用teaching数据库中的表进行操作)
(1)利用两种方法创建一个SQL Server登录名User1,密码为Abc!@#213
USE master
GO
CREATE LOGIN USER1 WITH PASSWORD =' Abc!@#213'
(2)练习利用登录名USER1连接服务器
选择SQL Server身份认证,在用户名中输入登录名User1,密码为Abc!@#213;单击“连接”按钮后,SQL Server 2005 Management Studio将连接到指定的服务器。
(3)练习在teaching数据库中为SQL Server登录名USER1添加数据库用户,并取名为USER2,默认架构为TEAC。
USE teaching
GO
CREATE USER USER2 FOR LOGIN USER1
WITH DEFAULT_SCHEMA =TEAC
GO
(4)练习为teaching数据库新创建一个数据库用户USER2,并为其赋予子查询student表的权限
USE teaching
GO
GRANT SELECT ON student TO USER2
GO
实现步骤如下:
(1)在SQL Server管理控制台中,展开SQL Server服务器组中相应服务器。
(2)创建一个新的登录帐户USER2。
(3)展开teaching数据库,在teaching数据库中创建一个新的数据库用户USER2。
(4)右击新创建的数据库用户USER2,在弹出的快捷菜单中选择“属性”选项。打开“数据库用户 - USER2”对话框。在属性对话框中选择“安全对象”选择页。
(5)单击“添加”按钮,打开“添加对象”对话框。
(6)在“添加对象”对话框中单击“特定对象”,并单击“确定”,打开“选择对象”对话框
(7)在“选择对象”对话框中,单击“对象类型”,打开“选择对象类型”对话框。
(8)在“选择对象类型”对话框中选中“表”,并单击“确定”按钮。在“选择对象”对话框中选择“浏览”按钮,会打开“查找对象”对话框。
(9)在“查找对象”对话框中选中student数据表前面的复选框,并单击两次“确定”按钮,返回数据库用户属性窗口。
(10)在选择结果对话框中选中SELECT权限对应的“授予”复选框。并单击“确定”按钮,即完成了此题的要求。
(5)练习将teaching数据库中创建表的权限授予用户USER2。 USE teaching
GO
GRANT CREATE TABLE TO USER2
GO
五、实验总结
通过这次实验,我了解SQL Server 2005的安全架构,掌握以服务器为主体的安全管理的基本操作和以数据库为主体的安全管理的基本操作,但是对用户进行权限管理的常用操作还不是很熟练,需要在平时的操作中加强练习。
实验十 备份与恢复(实验报告)
一、目的
1.了解备份与恢复数据库的备份策略的选择。
2.掌握备份数据库的基本操作。
3.掌握恢复数据库的基本操作。
二、实验环境
SQL2005。
三、实验原理
掌握SQL Server 2005的安全管理。
四、实验报告
完成书上上机练习题。(利用teaching数据库中的表进行操作)
(1)练习对数据库teaching创建完整数据库备份和差异备份。 完整数据库备份:
USE teaching
GO
BACKUP DATABASE teaching
TO DISK = N'F:\sqlprogram_ex\第11章\backteaching'
WITH EXPIREDATE = N'12/22/2009 00:00:00',
NAME = N'teaching-完整数据库备份',
STATS = 10
GO
差异备份:
BACKUP DATABASE teaching
TO DISK = N'F:\sqlprogram_ex\第11章\backteaching'
WITH DIFFERENTIAL ,
EXPIREDATE = N'12/22/2009 00:00:00',
NOFORMAT, NOINIT,
NAME = N'teaching-差异数据库备份',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position
from msdb..backupset
where database_name=N'teaching' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'teaching' )
if @backupSetId is null
begin
raiserror(N'验证失败。找不到数据库“teaching”的备份信息。', 16, 1)
end
RESTORE VERIFYONLY
FROM DISK = N'F:\sqlprogram_ex\第11章\backteaching'
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO
(2)练习通过上述完整数据库备份和差异备份对数据库teaching进行恢复。
RESTORE DATABASE teaching
FROM DISK = N'F:\sqlprogram_ex\第11章\backteaching'
WITH FILE = 2, NORECOVERY, NOUNLOAD,
STATS = 10
GO
RESTORE DATABASE teaching
FROM DISK = N'F:\sqlprogram_ex\第11章\backteaching'
WITH FILE = 3, NOUNLOAD,
STATS = 10
GO
(3)练习为SQL Server2005系统事务日志创建备份设备,并备份teaching数据库的事务日志。
USE master
GO
EXEC master.dbo.sp_addumpdevice
@devtype = N'disk',
@logicalname = N'device1',
@physicalname = N'F:\sqlprogram_ex\第11章\back_device1.bak'
GO
--备份teaching数据库的事务日志
BACKUP LOG teaching
TO device1
WITH RETAINDAYS = 3, NOFORMAT, NOINIT,
NAME = N'teaching-事务日志备份',
SKIP, NOREWIND, NOUNLOAD,
STATS = 10
GO
(4)如果有一个大小为1024GB的数据库,数据库中的表创储于一
SQL SERVER定时作业的设置方法
如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,
可以用管理->SQL Server代理->作业来实现。
1、管理->SQL Server代理->作业(按鼠标右键)->新建作业->
2、新建作业属性(常规)->名称[自定义本次作业的名称]->启用的方框内是勾号->
分类处可选择也可用默认的[未分类(本地)]->所有者默认为登录SQL Server用户[也可选其它的登录]->
描述[填写本次工作详细描述内容];
[ 创建作业分类的步骤:
SQL Server代理->作业->右键选所有任务->添加、修改、删除 ]
3、新建作业属性(步骤)->新建->步骤名[自定义第一步骤名称]->类型[Transact-SQL(TSQL)脚本]->
数据库[要操作的数据库]->命令
[ 如果是简单的SQL直接写进去即可,也可用打开按钮输入一个已写好的*.sql文件 如果要执行存储过程,填
exec p_procedure_name v_parameter1,[ v_parameter2…v_parameterN] ]
->确定
(如果有多个步骤,可以再次调用下面的新建按钮;也可以对已有的多个步骤插入、编辑、删除);
4、建作业属性(调度)->新建调度->名称[自定义调度名称]->启用的方框内是勾号->调度->反复出现->
更改[调度时间表]->确定
(如果只要保存此作业,不要定时做可以把启用的方框内是勾号去掉);
5、建作业属性(通知)->用默认的通知方法就好[当作业失败时,写入Windows应用程序系统日志] ->确定。
跟作业执行相关的一些SQL Server知识:
SQLSERVERAGENT服务必须正常运行,启动它的NT登录用户要跟启动SQL Server数据库的NT登录用户一致。
点作业右键可以查看作业执行的历史记录情况,也可以立即启动作业和停止作业。
最近在看作业历史记录时,发现有的作业记录的历史记录多,有的作业记录的记录的历史记录少.
如何能使某些作业按各自的需求,保留一段时间.比如保留一个月的历史记录.
看了SQL Server的在线帮助文档,里面介绍说:
在管理->SQL Server代理->右键选属性->作业系统->限制作业历史记录日志的大小->
作业历史记录日志的最大大小(行数) 默认为1000 如果某台机器的作业数量很多,一定要提高它,例如为100000
每个作业历史记录日志的最大行数 默认为100 如果作业每天执行两次,需要保留一个月的日志,可以设为60
它们之间有一个相互制约关系, 我们可以根据自己的需要来改.
如果SQL Server服务器改过机器名, 管理是旧名称时建立的job的时候可能会遇到
错误14274: 无法添加、更新或删除从MSX服务器上发起的作业(或其步骤或调度)
看了Microsoft的文档:
说SQL Server 2000系统里msdb..sysjobs 里originating_server 字段里存的是原来的服务器的名称.
24X7在用的系统肯定不能按上面Microsoft的文档说的那样把名字改回来又改过去。
于是想,msdb..sysjobs 能否update originating_server 字段成现在在用的新服务器名?
use msdb
select * from sysjobs
找到originating_server 字段还是旧服务器的job_id, 然后执行update语句:
update sysjobs set originating_server='new_server_name'
where job_id='B23BBEBE-A3C1-4874-A4AB-0E2B7CD01E14'
(所影响的行数为 1 行)
这样就可以添加、更新或删除那些曾经出error 14274 的作业了。
如果想把作业由一台机器迁移到另一台机器,可以先保留好创建作业的脚本, 然后在另一台机器上运行。
导出所有作业的创建脚本操作步骤:
管理->SQL Server代理->作业(鼠标右键)->所有任务->生成SQL脚本->保存到操作系统下的某个sql文件
导出某一个作业的创建脚本操作步骤:
管理->SQL Server代理->作业->选中待转移的作业(鼠标右键)->所有任务->生成SQL脚本->保存到OS下的某个sql文件
然后在目的服务器上运行刚才保存下来的创建作业的sql脚本。
( 如果建作业的用户或者提醒的用户不存在, 则会出错;
我们需要在目的服务器上建立相关的WINDOWS用户或者SQL Server数据库登录,
也可以修改创建作业的脚本, 把目的服务器上不存在的用户替换成已经有的用户。
如果生成日志的物理文件目录不存在,也应该做相关的修改,例如d:\区转f:\区等
字符串的 @command 命令里有分隔符号 go 也会出错, 可以把它去掉)
如何在SQL Server 2005中使用作业实现备份和特定删除
步骤如下:
1.需要启动服务Sql Server Agent(sql server 代理)
2.新建作业,名称为backupDatabase
3.选择步骤,点击“新建”,输入步骤名称,选择需要备份的数据库,然后再命令中写上:
DECLARE @data_ago NVARCHAR(50)
DECLARE @cmd VARCHAR(50)
SET @data_ago = 'D:\bak\' + 'backupname' + CONVERT(CHAR(8), GETDATE() -15, 112)
+ '.bak'
SET @cmd = 'del ' + @data_ago
EXEC MASTER..xp_cmdshell @cmd
DECLARE @strPath NVARCHAR(200)
SET @strPath = 'D:\bak\' + 'backupname' + CONVERT(CHAR(8), GETDATE(), 112) +
'.bak'
BACKUP DATABASE [databasename] TO DISK = @strPath WITH NOINIT , NOUNLOAD ,
NOSKIP , STATS = 10, NOFORMAT
说明:databasename是备份的数据库名称;backupname是备份时文件名称
4.选择计划,点击“新建”,输入计划的名称,根据自己的需要选择频率,每天频率等。 SQL Server 2005 中引入的 xp_cmdshell 选项是服务器配置选项,
使系统管理员能够控制是否可以在系统上执行 xp_cmdshell 扩展存储过程。 默认情况下,xp_cmdshell 选项在新安装的软件上处于禁用状态,
但是可以通过使用外围应用配置器工具或运行 sp_configure 系统存储过程来启用它, 如下示例所示:
1、打开外围应用配置器:勾选启用xp_cmdshell
2、运行 sp_configure 系统存储过程来启用,
代码如下
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
SQL2000中创建作业{sql代理作业历史记录日志}.
SQL2000中创建作业(定时查询,更新)
2008-01-07 20:20
企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:
update base set flag=0 where datediff(dd,date,getdate())=0 --确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排为一天一次
然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
============================
在sql server中创建作业(转)
如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,
可以用管理->SQL Server代理->作业来实现。
1、管理->SQL Server代理->作业(按鼠标右键)->新建作业->
2、新建作业属性(常规)->名称[自定义本次作业的名称]->启用的方框内是勾号->
分类处可选择也可用默认的[未分类(本地)]->所有者默认为登录SQL Server用
户[也可选其它的登录]->
描述[填写本次工作详细描述内容];
[ 创建作业分类的步骤:
SQL Server代理->作业->右键选所有任务->添加、修改、删除 ]
3、新建作业属性(步骤)->新建->步骤名[自定义第一步骤名称]->类型
[Transact-SQL(TSQL)脚本]->
数据库[要操作的数据库]->命令
[ 如果是简单的SQL直接写进去即可,也可用打开按钮输入一个已写好的*.sql文件
如果要执行存储过程,填
exec p_procedure_name
v_parameter1,[ v_parameter2„v_parameterN]
]
->确定
(如果有多个步骤,可以再次调用下面的新建按钮;也可以对已有的多个步骤插入、编辑、删除);
4、建作业属性(调度)->新建调度->名称[自定义调度名称]->启用的方框内是勾号->调度->反复出现->
更改[调度时间表]->确定
(如果只要保存此作业,不要定时做可以把启用的方框内是勾号去掉);
5、建作业属性(通知)->用默认的通知方法就好[当作业失败时,写入Windows应用程序系统日志] ->确定。
跟作业执行相关的一些SQL Server知识:
SQLSERVERAGENT服务必须正常运行,启动它的NT登录用户要跟启动SQL Server数据库的NT登录用户一致。
点作业右键可以查看作业执行的历史记录情况,也可以立即启动作业和停止作业。
最近在看作业历史记录时,发现有的作业记录的历史记录多,有的作业记录的记
录的历史记录少.
如何能使某些作业按各自的需求,保留一段时间.比如保留一个月的历史记录. 看了SQL Server的在线帮助文档,里面介绍说:
在管理->SQL Server代理->右键选属性->作业系统->限制作业历史记录日志的大小->
作业历史记录日志的最大大小(行数) 默认为1000 如果某台机器的作业数量很多,一定要提高它,例如为100000
每个作业历史记录日志的最大行数 默认为100 如果作业每天执行两次,需要保留一个月的日志,可以设为60
它们之间有一个相互制约关系, 我们可以根据自己的需要来改.
如果SQL Server服务器改过机器名, 管理是旧名称时建立的job的时候可能会遇到
错误14274: 无法添加、更新或删除从MSX服务器上发起的作业(或其步骤或调度)
看了Microsoft的文档:
说SQL Server 2000系统里msdb..sysjobs 里originating_server 字段里存的是原来的服务器的名称.
24X7在用的系统肯定不能按上面Microsoft的文档说的那样把名字改回来又改过去。
于是想,msdb..sysjobs 能否update originating_server 字段成现在在用的新服务器名?
use msdb
select * from sysjobs
找到originating_server 字段还是旧服务器的job_id, 然后执行update语句: update sysjobs set originating_server='new_server_name'
where job_id='B23BBEBE-A3C1-4874-A4AB-0E2B7CD01E14'
(所影响的行数为 1 行)
这样就可以添加、更新或删除那些曾经出error 14274 的作业了。
如果想把作业由一台机器迁移到另一台机器,可以先保留好创建作业的脚本, 然后在另一台机器上运行。
导出所有作业的创建脚本操作步骤:
管理->SQL Server代理->作业(鼠标右键)->所有任务->生成SQL脚本->保存到操作系统下的某个sql文件{sql代理作业历史记录日志}.
导出某一个作业的创建脚本操作步骤:
管理->SQL Server代理->作业->选中待转移的作业(鼠标右键)->所有任务->生成SQL脚本->保存到OS下的某个sql文件
然后在目的服务器上运行刚才保存下来的创建作业的sql脚本。
( 如果建作业的用户或者提醒的用户不存在, 则会出错;
我们需要在目的服务器上建立相关的WINDOWS用户或者SQL Server数据库登录, 也可以修改创建作业的脚本, 把目的服务器上不存在的用户替换成已经有的用户。
如果生成日志的物理文件目录不存在,也应该做相关的修改,例如d:\区转f:\区等
字符串的 @command 命令里有分隔符号 go 也会出错, 可以把它去掉) ==================
在数据库的应用系统中,充分的利用数据库的后台服务端的功能可以可以简化客户端前台的工作,更可以降低网络的负荷,同时使整个系统设计更合理,便于维护移植和升级,后台计划任务作业在很多数据库应用中经常会用到,当然是配合存储过程使用。
在SQL Server2000中,可以手动一步一步的在企业管理器中建立后台计划任务作业,但这样既麻烦也不便于发布,因此本文给出使用T-SQL脚本创建作业的方法。
需要下面三个SQL Server2000 msdb系统库中的存储过程来完成作业的建立,在此之前请先开启数据库实例的SQLServerAgent服务,SQL Server安装后默认是没有启动该服务的。
顺便说一句,SQL Server在2000版本中才有了明显的“实例”的概念,在
7.0版中没有明确的实例,因此在SQL Server2000默认安装时创建了一个默认实例,这是为了和SQl Server 7.0兼容,如果你是默认方式创建的实例,则实例名为空。啥子?你不晓得啥子是“实例”?个人去找点资料看看,oracel、sybase都有实例和表空间,所以我叫SQL Server2000之前的SQL Server为桌面数据库。
进入正题,步骤是“作业”-〉“作业调度”-〉“作业步骤”,具体如下:
1、使用sp_add_job 添加由 SQLServerAgent 服务执行的新作业。
2、使用sp_add_jobschedule创建作业调度。
3、使用sp_add_jobstep将一个步骤(操作)添加到作业中
下面以在汽车客运站票务系统中的脚本为例给出实际例子,在看例子之前,请先看一下上面三个系统存储过程的帮助。在例子中使用了一个自定义的存储过程“tksp_bakdata”,它的功能是处理当日之前售票数据(只需知道是一个自定义存储过程就行了)。
例子1:每日0点30分处理售票数据
use msdb
EXEC sp_add_job @job_name = 'tk_bakdata',
@enabled = 1,
@description = '每日00:30处理售票数据',
@start_step_id = 1,
@owner_login_name = 'tkuser'
exec sp_add_jobserver @job_name = 'tk_bakdata'
go
EXEC sp_add_jobschedule @job_name = 'tk_bakdata',
@name = 'Bakdata003000',
@freq_type = 4,
@freq_interval = 1,
@active_start_time = 003000
go
EXEC sp_add_jobstep @job_name = 'tk_bakdata',
@step_name = 'bakdata',
@subsystem = 'TSQL',
@command = 'EXEC tksp_bakdata ',
@database_name='ticket'
go
例子2:每日SQLServer启动时处理售票数据,这样在每天需要关机的服务器中
SQL数据库作业
第二次书面作业
要求:使用学校要求统一的作业纸(包括封面),作业只能手写,不可以打印(打印为零分)。下周上小课交给小课老师。
第1题:
人力资源部门决定希望能保留求职者的历史记录,以便于在新职位出现时可联系过去未成功的求职者,如果随着时间的推移他们申请了不同的职位,则可以比较求职者提供的信息。在与人力资源团队进行协商之后,高级数据库开发人员决定需要一个新表来存储这些历史信息。高级数据库开发人员要求您:
创建一个名为 HumanResources.JobCandidateHistory 的新表。JobCandidateHistory 表有以下列和约束:
● JobCandidateID。不可包含 null 值的 int 列。此列中的值必须是惟一的。
● Resume。可包含 null 值的 nvarcher 列。
● Rating。不可包含 null 值的 int 列。此列中的值必须介于 1 到 10 之间,默认值为 5。
● RejectedDate。不可包含 null 值的 datetime 列。
● ContactID。可包含 null 值的 int 列。此列是 Person.Contact 表中的 ContactID 列的外键。
测试 JobCandidateHistory 表和约束
在 HumanResources.JobCandidate 表上创建一个名为 dJobCandidate 的新的 DELETE 触发器,它在有人删除求职者时将该求职者的信息复制到 HumanResources.JobCandidateHistory 表中。JobCandidateID 和 Resume 列必须直接复制过去,并且 RejectedDate 通过使用 getdate 函数设置为当前日期。Rating 应保留为其默认值,并且 ContactDetails 应设置为 NULL。
CREATE TABLE HumanResources.JobCandidateHistory
(
JobCandidateID int NOT NULL primary key, Resume varchar(20) NULL, Rating INT NOT NULL CHECK(Rating>=1 AND Rating<=10) DEFAULT (5), RejectedDate datetime NOT NULL,
ContactID INT NULL
GO
ALTER TABLE HumanResources.JobCandidateHistory
ADD CONSTRAINT FK_ContactID
FOREIGN KEY (ContactID) )
REFERENCES Person.Contact(ContactID)
CREATE TABLE HumanResources.JobCandidate (
JobCandidateID int NOT NULL primary key, Resume varchar(20) NULL, Rating INT NOT NULL CHECK(Rating>=1 AND Rating<=10) DEFAULT (Rating=5),
RejectedDate datetime NOT NULL,
ContactDetails varchar(20) NULL
)
CREATE TRIGGER dJobCandidate ON HumanResources.JobCandidate
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON
DECLARE @JobCandidateID INT
DECLARE @Resume varchar(20)
DECLARE @RejectedDate datetime
SELECT
@JobCandidateID=DELETED.[JobCandidateID],@Resume=DELETED.[Resume],@RejectedDate=GETDATE()
INSERT INTO HumanResources.JobCandidateHistory (JobCandidateID, Resume,RejectedDate)
VALUES (@JobCandidateID,@Resume,@RejectedDate)
END
第2题:
用下述语句创建视图
CREATE VIEW ProductsView
AS
SELECT ProductID, Price, Company
FROM Supplier
INNER JOIN Products
ON Suppliers.ID = Products.SupplierID
ORDER BY ProductID
出现错误,为什么,如何修改。请写出原因与修改后的创建视图的T-SQL命令。
ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,
去掉ORDER BY。
CREATE VIEW ProductsView
AS
SELECT ProductID, Price, Company
FROM Supplier
INNER JOIN Products
ON Suppliers.ID = Products.SupplierID
第3题:
Adventure Works 维护着一份各种产品在全年中的特价供应和折扣的列表,该列表同时适用于客户和分销商。目前,此信息只能直接从 Sales.SpecialOffer 表中获得。一项新提出的要求是能够使用存储过程和用户定义函数检索此信息,并且使用存储过程插入新的特价供应。
要求如下:
1. 在 Sales 架构中创建名为 GetDiscountsForCategoryAndDate 的存储过程,该过程接
受@Category 参数,此参数为 nvarchar 数据类型,并且最多接受 50 个字符,和
另一个 @DateToCheck datetime 输入参数。
o @DateToCheck 参数必须能够接受 NULL 默认值。如果为 @DateToCheck
参数指定了 NULL 值,则使用 GETDATE 函数将该参数值设置为当前日
期和时间。
o 该过程从 Sales.SpecialOffer 中检索以下列:Description、DiscountPct、Type、
Category、StartDate、EndDate、MinQty 和 MaxQty。应该基于 @Category
和 @DateToCheck 参数筛选行。
CREATE PROC Sales.GetDiscountsForCategoryAndDate
AS
IF(@DateToCheck IS NULL)
SELECT @DateToCheck=GETDATE(){sql代理作业历史记录日志}.{sql代理作业历史记录日志}.
SELECT
Description,DiscountPct,Type,Category,StartDate,EndDate,MinQty,MaxQty FROM Sales.SpecialOffer WHERE Category=@Category AND
StartDate=@DateToCheck @Category varchar(50), @DateToCheck datetime
2. 在 Sales 架构中创建名为 AddDiscount 的存储过程,该过程向 Sales.SpecialOffer
该 INSERT 语句必须由相应的错误处理进行保护,并且任何错误都必须记录在 dbo.ErrorLog 表中。如果新的插入成功,则 @NewProductID 参数必须以 SCOPE_IDENTITY 函数值进行更新。返回值还必须指示插入是成功还是失败。
BEGIN TRY
CREATE PROC Sales.AddDiscount
@Description nvarchar(255)
@DiscountPct smallmoney
@Type nvarchar(50)
@Category nvarchar(50)