Процедуры планирования в SQL Server 2008 я делаю это правильно или есть проблемы? - PullRequest
2 голосов
/ 22 июля 2010

РЕДАКТИРОВАТЬ: проблема с электронной почтой я получаю исключение недоступно для почтового ящика!DBEmail.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Serialization;
using System.IO;
using System.Xml;
using System.Text;
using System.Net;
using System.Net.Mail;
using System.Xml.Linq;


public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure()]
    public static void DBEmail(string Sender, string SendTo, string Subject, string Body, string mailServer)
    {
        System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage();
        m.From = new System.Net.Mail.MailAddress(Sender);
        m.To.Add(new System.Net.Mail.MailAddress(SendTo));
        m.Subject = Subject;
        m.Body = Body;
        System.Net.Mail.SmtpClient client = null;
        client = new System.Net.Mail.SmtpClient();
        client.Host = mailServer;
        client.UseDefaultCredentials = false;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.Credentials = new System.Net.NetworkCredential("User@MySite.com", "password");
        client.Send(m);
    }
}

Мне нужно запустить некоторые хранимые процедуры ночью.Итак, я создал файл .sql, который в основном -

exec proc1
exec proc2...

Так ли это нормально, если я просто запускаю их так, или они должны быть завернуты в начало или что-то еще ... Далее у меня естькомандный файл, который я планирую запустить -

sqlcmd -S myserver.myserver.com -i 
D:\Scripts\StartProcs.sql -U username -P password -o D:\Scripts\log.txt

Правильно ли приведенный выше скрипт?Я имею в виду, что он работает, он проверен, работает на нем ... но мне просто нужно убедиться, что я не пропускаю какие-либо другие проблемы здесь?Потому что я видел некоторые другие команды sqlcmd, которые были очень длинными и принимали много параметров ... Я просто хочу убедиться, что я не пропускаю никаких важных параметров ..

Пожалуйста, исправьте меня выше с помощью файла .sql иликомандный файл ... если я не принял во внимание какие-либо вопросы?... Спасибо

Ответы [ 3 ]

1 голос
/ 22 июля 2010

Другая идея состоит в том, чтобы отделить каждого exec с помощью пакетной команды GO .

, например

exec proc1<
GO
exec proc2
GO...

Это означает, что каждый exec будет обрабатываться самостоятельно.

1 голос
/ 22 июля 2010

Единственная проблема, которую я вижу, состоит в том, что с этой техникой (если у вас нет чего-то встроенного в процессоры) вы не будете автоматически уведомлены, если что-то пойдет не так, или в этом случае, если оно завершится успешно.

В SQL Server Express вы можете добавить функцию CLR, которую можно использовать для отправки вам электронного письма с отчетом о результатах вышеупомянутых sprocs.

А вот как вы это сделаете, используя все бесплатные инструменты.

Сначала Убедитесь, что включена интеграция CLR, выполнив эту команду

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

Вам также потребуетсяподписать сборку или пометить БД как надежную.Чтобы пометить надежную БД, убедитесь, что вы вошли в SQL Server как член роли SysAdmin и выполните эту команду

ALTER DATABASE YourDBName SET TRUSTWORTHY ON;

Далее сохраните следующее как C: \ Code \ DBEmail.cs

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure()]
    public static void DBEmail(string Sender, string SendTo, string Subject, string Body, string mailServer)
    {
        System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage();
        m.From = new System.Net.Mail.MailAddress(Sender);
        m.To.Add(new System.Net.Mail.MailAddress(SendTo));
        m.Subject = Subject;
        m.Body = Body;

        System.Net.Mail.SmtpClient client = null;
        client = new System.Net.Mail.SmtpClient();
        client.Host = mailServer;

        client.Send(m);
    }
}

Затем найдите компилятор строки C # Comand в соответствующем каталоге .Net Framework, в моем случае это «C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727») и выполните его.

csc.exe /target:library /out:C:\Code\DBEmail.dll C:\Code\DBEmail.cs

Затем скопируйте полученный C: \ Code \ DBEmail.dll на SQL Server, если вы еще не подключены к нему, и в Management Studio выполните это.

CREATE ASSEMBLY [DBEmail]
AUTHORIZATION [dbo]
From 'C:\Code\DBEmail.dll'
WITH PERMISSION_SET = External_Access

Наконец создайте sprocдля сопоставления с кодом CLR, выполнив это

CREATE PROCEDURE [dbo].[usp_DBEmail]
    @Sender [nvarchar](255),
    @SendTo [nvarchar](255),
    @Subject [nvarchar](255),
    @Body [nvarchar](max),
    @mailserver [nvarchar](55)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [DBEmail].[StoredProcedures].[DBEmail]

Затем вы можете просто обернуть код внутри запланированных sprocs в Try Catch и, если произойдет ошибка, отправить себе сообщение об ошибке в электронном письме, как это.

BEGIN TRY
  --Your SQL Stuff
END TRY
BEGIN CATCH
    Declare @error as nvarchar(max);
    SELECT @error = ERROR_NUMBER();
    Exec usp_DBEmail @Sender='sender@xyz.com', @SendTo='you@xyz.com', @subject='Whoops', @Body=@error, @mailserver='smtp_ip'
END CATCH;

Надеюсь, это полезно!

1 голос
/ 22 июля 2010

Несколько подряд подряд просто отлично.Так мы выполняли ночные задания в течение многих лет.

Вместо планировщика заданий Windows рассмотрите возможность планирования наших заданий в агенте SQL.Агент SQL является частью SQL Server, и именно там большинство администраторов баз данных ожидают найти задания SQL.Агент SQL поставляется с возможностью отправлять сообщения об ошибках, когда что-то идет не так, и имеет встроенную систему регистрации ошибок.

Но запланированный пакетный файл также будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...