继续等待啊,在msdn的sql server版、itpub上都发了,都没有人知道

解决方案 »

  1.   

    用户将信息添加到A表,其中有一个时间字段,A表的insert触发器根据这个时间,建立一个在这个时间执行的作业 
    作业运行之后,会将A表中的该条数据删除,A表中的delete触发器会删除该条记录相应的作业 楼主这样设计确实很强悍。
      

  2.   

    A表中的该条数据删除,A表中的delete触发器会删除该条记录相应的作业 
    这样都行?
      

  3.   

    to 9楼:我的作业名称是根据A表中的id来的,根据删除的记录id,就可以知道作业名称,然后调用msdb.dbo.sp_delete_job @job_name=作业名称   来删除作业的
    to 7楼:大家对这样的设计有什么看法,或者觉得可能会引起什么问题,一起提出来吧
      

  4.   

    楼主原话:
    A表的insert触发器根据这个时间,建立一个在这个时间执行的作业 
    作业运行之,会将A表中的该条数据删除,A表中的delete触发器会删除该条记录相应的作业 这儿有个词不太准确,即上面那个"后",不管怎么说,都是这个作业将记录删除的,因此删除操作是在作业运行的过程中,而不是过程后,即使这个删除语句是作业的最后一句,依然如此.如果是过程后,那删除操作就不是这个作业的任务,那与楼主创建作业的目的是不相符的.
    从过程调用的角度去看,作业就是个调用程序,而删除操作及其所引发的触发器是被调用程序,调用程序调用被调程序,是在调用程序中建立一个中断,转去执行被调程序,执行完了必须返回到调用程序,哪怕这个调用是这段程序的最后一句,也必须返回,否则程序执行就没有了终止点,这是不可以的.
    因此,由作为被调用程序的触发器去删除作为调用程序的作业,必定产生死锁.
      

  5.   

    我觉得这样的设计过于繁琐了。既然考滤表中加入记录时,创建一个作业,并在在记录特定字段指定的时间去执行这个作业, 作业在执行完后,再删除记录并删除此作业。过程就是:增加记录>创建作业>在记录指定时间调度>删除记录>删除作业既然,一个对于这个表中每一条新加入的记录都要这样处理,那么 这个作业的模式对所有记录应该都是一样的,或者说有着自己的规律,可能的区别是以记录中某些列值或者运行时的一些条件来做不同的处理。那么我就在想,是否有必要这么设计?如果我将表增加一个列: hasBeenExecuted bool not null default 0我只建立一个固定的作业去扫描表,读取表中hasBeenExecuted 为 0 且 指定列为当前时间(比如可以精确到分钟或者5分钟范围) 的记录,循环执行对各条记录需要的处理。
    另外建一个作业,定时删除 hasBeenExecuted 为1 的记录.(或者也可以放在前一个作业中进行)这样是否会简单很多?两种做法的比较:
    原始做法,如果表的写操作(insert,delete)很频繁,就要频繁的建,删job,很耗资源  但从job处理的脚度来说,可以不考滤这个表的数据量,因为记录加入时job就已经好了,应该不需要再读取记录信息。
    固定做业的做法,如果表的写操作很频繁,对于job处理的脚度来说,没有什么影响,而影响最大的因素是表的数据量的大小,特别是hasBeenExeucted=0且时间符合条件的记录的数据量。
      

  6.   

    本帖最后由 fcuandy 于 2009-06-12 02:07:01 编辑