【触发器】【作业】想自己动手做个外部小程序!望指点指点!

q85958341 2010-03-24 04:35:31
DC_count表
DC_time in_number out_number remain
2010-03-18 100 50 60

test表基本有用字段字段
id type time flag
1 加 2010-03-18 1
2 减 2010-03-18 1
3 加 2010-03-18 0
4 加 2010-03-18 1


想对test表做个小的外部统计程序
我的思路比较笨..如下
1.通过每晚0点,作业,SQL自动在DC_count表中添加一条
DC_time =convert(varchar(10),getdate(),120)
in_number=0
out_number=0
remain=前一天的remain,没有,默认为60

2. 通过 触发器,监视test表的insert事件
每当插入1条flag=1的,并type=加的
则更新DC_count表 in_number = in_number +1
每当插入1条flag=1的,并type=减的
则更新DC_count表 in_number = out_number -1

问题:
1. 每晚0点,如何自动添加。作业没接触过!
2.
 Create Trigger truCount 
On test
for insert
As
if(type='加' and flag='1')
begin
Update DC_count
Set in_number=in_number+1
From DC_count DC , Deleted d ,Inserted i
Where DC.DC_time=i.inouttime
end
if(type='减' and flag='1')
begin
Update DC_count
Set in_number=in_number-1
From DC_count DC , Deleted d ,Inserted i
Where DC.DC_time=i.inouttime
end


这触发器对么?
如果我想让 type=‘乘’时 in_number+1 又该如何实现。(貌似不能接受参数)
...全文
203 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
youzhj 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jwwyqs 的回复:]
SQL code
sql作业调度默认分类 2009-09-17 11:28:42 阅读230 评论0 字号:大中小
sql作业调度定时查询

企业管理器

--管理

--SQL Server代理

--右键作业

--新建作业

--"常规"项中输入作业名称

--"步骤"项

--新建

--"步骤名"中输入步骤名

--"类型"……
[/Quote]up一下
东那个升 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 q85958341 的回复:]
引用 5 楼 ldslove 的回复:
SQL code
Create Trigger truCount On test for insert
As
Update DC
Set DC.in_number=case when type in('乘','加') and flag='1' then in_number+1
when type='减' and flag=……


不是这个……
[/Quote]

那你还是用SP吧,插入的时候顺带把它更新掉就可以了。
永生天地 2010-03-24
  • 打赏
  • 举报
回复
问题一:上面答案很多,不行网上搜一下,图文并茂的都有
问题二:触发器不能设参数,只能用if或case作判断

另,如果1、2是同时的,可以一起写道存储过程里
q85958341 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ldslove 的回复:]
SQL code
Create Trigger truCount On test for insert
As
Update DC
Set DC.in_number=case when type in('乘','加') and flag='1' then in_number+1
when type='减' and flag=……
[/Quote]

不是这个意思,加,减,乘,那只是我临时搞的,
实际最好是能由下拉框值决定,是哪个type为+1,哪个为-1

附:
我那触发器写太简陋,需要加上事务等处理么?
东那个升 2010-03-24
  • 打赏
  • 举报
回复
Create Trigger truCount On test    for insert
As
Update DC
Set DC.in_number=case when type in('乘','加') and flag='1' then in_number+1
when type='减' and flag='1' then in_number-1 end
From DC_count DC ,Inserted i
where Where DC.DC_time=i.inouttime


???????
jwwyqs 2010-03-24
  • 打赏
  • 举报
回复
sql作业调度默认分类 2009-09-17 11:28:42 阅读230 评论0 字号:大中小 
sql作业调度定时查询

企业管理器

--管理

--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的文档:http://support.microsoft.com/default.aspx?scid=kb;en-us;281642

说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 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分处理售票数据

www.knowsky.com

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启动时处理售票数据,这样在每天需要关机的服务器中也能保证处理售票数据。

use msdb

EXEC sp_add_job @job_name = 'tk_bakdata2',

@enabled = 1,

@description = '每日SQLServer启动时处理售票数据',

@start_step_id = 1,

@owner_login_name = 'tkuser'

exec sp_add_jobserver @job_name = 'tk_bakdata2'

go

EXEC sp_add_jobschedule @job_name = 'tk_bakdata2',

@name = 'BakdataStart',

@freq_type = 64

go

EXEC sp_add_jobstep @job_name = 'tk_bakdata2',

@step_name = 'BakdataStart',

@subsystem = 'TSQL',

@command = 'EXEC tksp_bakdata ',

@database_name='ticket'

go
dawugui 2010-03-24
  • 打赏
  • 举报
回复
1. 每晚0点,如何自动添加。作业没接触过!

定时作业?

定时作业的制定

企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:
EXEC 存储过程名 ... --该存储过程用于创建表

--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
q85958341 2010-03-24
  • 打赏
  • 举报
回复
OK,步骤2该如何实现
感觉我那做法挺不好的,不能接收参数!
--小F-- 2010-03-24
  • 打赏
  • 举报
回复
企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:

--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排为一天一次


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧