Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 计划执行代码以在SQL Server中执行数据库操作_Sql Server - Fatal编程技术网

Sql server 计划执行代码以在SQL Server中执行数据库操作

Sql server 计划执行代码以在SQL Server中执行数据库操作,sql-server,Sql Server,如果我想按计划执行一些数据库操作,我可以: 使用SQL Server代理(如果是SQL Server)定期调用存储过程和/或执行T-SQL 运行一些执行数据库操作的外部进程(例如,由操作系统的任务调度器调度) 等等 两个问题: 实现这一点的其他方法是什么 应该使用什么决策标准来决定最佳方法 谢谢。另一种可能是在某处有一个任务队列,当使用数据库的应用程序执行某些操作时,它们也会在队列外执行一些任务。Wikipedia的作业队列就是这样。日程安排不像其他方法那样确定,但当服务器负载过重时,您可以

如果我想按计划执行一些数据库操作,我可以:

  • 使用SQL Server代理(如果是SQL Server)定期调用存储过程和/或执行T-SQL

  • 运行一些执行数据库操作的外部进程(例如,由操作系统的任务调度器调度)

  • 等等

两个问题:

  • 实现这一点的其他方法是什么
  • 应该使用什么决策标准来决定最佳方法

  • 谢谢。

    另一种可能是在某处有一个任务队列,当使用数据库的应用程序执行某些操作时,它们也会在队列外执行一些任务。Wikipedia的作业队列就是这样。日程安排不像其他方法那样确定,但当服务器负载过重时,您可以推迟执行内务管理工作

    编辑: 它不一定比其他技术更好或更差。它适用于不必在任何特定截止日期前完成的任务,但应该“不时”完成,或者“很快,但不一定是现在”

    优势

    • 您不需要编写单独的应用程序或设置SQL Server代理
    • 您可以使用您可以编程的任何条件来决定是否运行任务:立即、一旦某个时间过去,或者仅当服务器未处于重载状态时
    • 如果计划的任务是优化索引之类的任务,那么您可以在不太必要时(例如更新很少时)减少执行这些任务的频率,而在更新很常见时更频繁地执行这些任务
    缺点

    • 您可能需要修改多个应用程序才能正确协作
    • 您需要确保队列不会堆积太多
    • 您无法可靠地确保任务在特定时间之前运行
    • 您可能有很长一段时间没有收到任何请求(例如,在夜间),延迟/计划的任务可以完成,但没有。你可以把它和其他的想法结合起来,用一个特殊的程序只做队列中的工作,但是你根本就不用担心队列

      • 我会选择SQL Server代理。它与SQL Server集成良好;各种SQL Server功能都使用代理(例如,日志传送)。例如,您可以创建一个代理作业来运行一个或多个SSIS包


        它还与操作员通知集成在一起,可以编写脚本,或者通过SMO执行。

        我认为决定标准的最佳方法是作业是什么。如果它是一个完全内部的SQL Server任务或一组与外部世界无关的任务,我认为a是最好的选择。另一方面,如果您正在检索数据,然后对其执行SQL Server之外固有的操作,在T-SQL中很难执行或很耗时,那么外部服务可能是最佳选择。

        我通常使用操作系统调度方法(Windows的任务调度程序,Unix的cron)

        我处理多个数据库平台(SQLServer、Oracle、Informix),希望任务调度尽可能通用


        此外,在我们的生产环境中,我们必须让DBA参与数据库中正在运行的作业的任何故障排除/重新启动。我们可以更好地访问带有计划任务的应用程序服务器。

        您不能真正依赖外部进程。我见过的所有基于“操作系统”的解决方案都未能在现实世界中提供:数据库不仅仅是数据,这主要是因为备份/恢复战略、高可用性战略、灾难可恢复性战略以及您在SQL Server许可证中支付的所有其他“活动”。基于操作系统调度器的系统将是一个完全不知道的外部组件,并且与它们中的任何一个都不集成。也就是说,您不能用数据备份/恢复您的计划,它不会对您的数据库进行故障转移,您不能通过SQL数据传送通道将其传送到远程灾难恢复站点

        如果您有代理(即非特快版),则使用代理。它有着悠久的使用历史,并且它的技术诀窍非常重要。代理的唯一问题是它依赖于msdb,这使得它与应用程序数据库断开连接,因此无法很好地使用基于镜像的可用性和可恢复性解决方案


        对于Express Edition(即无代理),最好的选择是基于(至少在SQL 2k5和forward中)滚动您自己的调度程序。您可以使用对话在所需的时间安排自己的消息,并依靠对话来运行任务。它们是事务性的,并且与您的数据库集成在一起,因此您可以依靠它们在恢复后以及镜像或群集故障转移后的存在。不幸的是,关于如何使用它们的诀窍相当肤浅,我的网站上有几篇关于这个主题的文章。我见过一些系统在Express上完全依赖对话计时器复制大量代理API

        Doug,这是另一种可能性,但是你能说它比其他的更好吗?我建议你避免在SQL提供基于队列的、激活启动的处理时重新发明轮子,这种处理从2K5开始就支持计时器…@remus:好的,我没有意识到。您应该使用它,而不是滚动您自己的.JP,也许您的意思是,“除非您使用SSI执行此外部操作”?John同意,这一点非常好。SSIS是一种接触外部世界的好方法。就我个人而言,我已经有点偏离了计划SSIS包,因为它们可能有点昂贵(旋转新流程等等),但这可能是我的错误看法。-1:对于混合平台,你是对的。但问题是关于SQL Server的。实际上,这是一个相当开放的问题,c