PowerDesigner16.5——實現E-R圖提交版本之後做郵箱自動推送提醒


IF EXISTS ( SELECT * FROM sys.procedures WHERE name = 'sp_Send_ER_Mail' )
    DROP PROC dbo.sp_Send_ER_Mail ;
GO

CREATE PROC sp_Send_ER_Mail
AS
BEGIN
    SET NOCOUNT ON ;

    SET XACT_ABORT ON ;

    IF NOT EXISTS ( SELECT * FROM dbo.sp_MailAccount_Setting )
        RETURN ;

    ---1.定義參數
    BEGIN

        --待發送賬戶,用';'分割
        DECLARE @Account_SQL NVARCHAR (MAX) ;
        --郵件內容
        DECLARE @Body NVARCHAR (MAX) ;
        --郵件隊列ID
        DECLARE @MailItemID INT ;
        --主題
        DECLARE @Subject NVARCHAR (100) = N'' ;
        --ER圖版本ID
        DECLARE @ERVerID INT ;
        --當前時間
        DECLARE @NowDate DATETIME ;

        --版本記錄表變量
        DECLARE @Temp_Table TABLE ( CombinSQL NVARCHAR (MAX)) ;
    END ;

    ---2.參數賦值(下面所有的BAcount_ER_Map_Version_DB都改成對應自己的倉庫數據庫)
    BEGIN
        SET @Account_SQL = ( SELECT Account + ';' FROM dbo.sp_MailAccount_Setting FOR XML PATH('')) ;
        SET @ERVerID = COALESCE(( SELECT MAX(ERVerID)FROM dbo.sp_ER_Mail_Record ), 0) ;

        IF NOT EXISTS ( SELECT * FROM BAcount_ER_Map_Version_DB.dbo.PMOBJT WHERE POID = 102 AND VCMT > @ERVerID )
            RETURN ;

        SET @Subject = (
                           SELECT MAX(A.NAME)FROM BAcount_ER_Map_Version_DB.dbo.PMOBJT A WHERE A.POID = 102
                       ) + N'項目ER圖新提交版本;' + CHAR(39) ;

        WITH CTE AS
        (
            SELECT ROW_NUMBER() OVER ( ORDER BY A.OCDT ) AS Ver,
                   A.VCMT,
                   A.OCDT,
                   B.TDAT
            FROM   BAcount_ER_Map_Version_DB.dbo.PMOBJT A
                   INNER JOIN BAcount_ER_Map_Version_DB.dbo.PMTEXT B ON A.VCMT = B.TXID
            WHERE
                   A.POID = 102
        ),
             CTE2 AS
        (
            SELECT ( CONVERT(NVARCHAR (100), DATEADD(HOUR, 8, CTE.OCDT), 20) + ' 提交Ver' + CONVERT(NVARCHAR (10), CTE.Ver) + '.0:' + CHAR(10) + CTE.TDAT )
                   + CHAR(10) AS CombinSQL
            FROM   CTE
            WHERE
                   CTE.VCMT > @ERVerID
        )
        INSERT INTO @Temp_Table ( CombinSQL ) SELECT CombinSQL FROM CTE2 ;

        SET @Body = ( SELECT CombinSQL + CHAR(10)FROM @Temp_Table FOR XML PATH('')) ;
        SET @NowDate = GETDATE() ;
    END ;

    ---3.發送郵件,並寫入日誌
    BEGIN
        EXECUTE [msdb].[dbo].[sp_send_dbmail] @profile_name = 'Send_ER_Mail',
                                              @recipients = @Account_SQL,
                                              @body = @Body,
                                              @subject = @Subject,
                                              @mailitem_id = @MailItemID OUTPUT ;

        --重新獲取最大ER版本ID
        SET @ERVerID = ( SELECT MAX(VCMT)FROM BAcount_ER_Map_Version_DB.dbo.PMOBJT ) ;

        INSERT INTO dbo.sp_ER_Mail_Record ( MailItemID, ERVerID, Recipient, Sender, MailSubject, MailBody, SendTime )
        SELECT @MailItemID,
               @ERVerID,
               Account,
               N'[email protected]',--(這裏改成對應自己的發件郵箱)
               @Subject,
               @Body,
               @NowDate
        FROM   dbo.sp_MailAccount_Setting ;
    END ;
END ;

EXEC sp_MS_marksystemobject 'sp_Send_ER_Mail' ; --標識爲系統對象
GO

背景:E-R圖倉庫存放在SQL server數據庫中,之後的代碼是基於SQL server實現

1.查詢版本更替數據

直接給代碼,在你對應的倉庫數據庫執行

WITH CTE AS
(
    SELECT A.NAME AS [倉庫名稱],
           A.CODE AS [倉庫碼],
           A.OCDT AS [提交時間],
           B.TDAT AS [備註],
           ROW_NUMBER() OVER ( ORDER BY A.OCDT ) AS [版本]
    FROM   dbo.PMOBJT A
           INNER JOIN dbo.PMTEXT B ON A.VCMT = B.TXID
    WHERE
           A.POID = 102
)
SELECT CTE.倉庫名稱, CTE.倉庫碼, CTE.版本, CTE.提交時間, CTE.備註 FROM CTE ;

下面是我本地倉庫的查詢結果

2.配置相關記錄表/存儲過程

(1)收件人Table:sp_MailAccount_Setting

IF EXISTS ( SELECT * FROM sys.tables WHERE name = 'sp_MailAccount_Setting' )
    DROP TABLE sp_MailAccount_Setting ;

CREATE TABLE sp_MailAccount_Setting
(
    Account     NVARCHAR (100), --郵箱賬戶
    AccountName NVARCHAR (100), --郵箱名稱
    Memo        NVARCHAR (MAX)
) ;

EXEC sp_MS_marksystemobject 'sp_MailAccount_Setting' ; --標識爲系統對象
GO

(2)發送記錄Table:sp_ER_Mail_Record


IF EXISTS ( SELECT * FROM sys.tables WHERE name = 'sp_ER_Mail_Record' )
    DROP TABLE sp_ER_Mail_Record ;

CREATE TABLE sp_ER_Mail_Record
(
    MailItemID  INT,            --郵件隊列ID
    ERVerID     INT,            --ER圖版本ID
    Recipient   NVARCHAR (100), --收件人
    Sender      NVARCHAR (100), --發件人
    MailSubject NVARCHAR (100), --主題
    MailBody    NVARCHAR (MAX), --郵件內容
    SendTime    DATETIME        --發件時間
) ;

EXEC sp_MS_marksystemobject 'sp_ER_Mail_Record' ; --標識爲系統對象
GO

(3)發送郵件存儲過程


IF EXISTS ( SELECT * FROM sys.procedures WHERE name = 'sp_Send_ER_Mail' )
    DROP PROC dbo.sp_Send_ER_Mail ;
GO

CREATE PROC sp_Send_ER_Mail
AS
BEGIN
    SET NOCOUNT ON ;

    SET XACT_ABORT ON ;

    IF NOT EXISTS ( SELECT * FROM dbo.sp_MailAccount_Setting )
        RETURN ;

    ---1.定義參數
    BEGIN

        --待發送賬戶,用';'分割
        DECLARE @Account_SQL NVARCHAR (MAX) ;
        --郵件內容
        DECLARE @Body NVARCHAR (MAX) ;
        --郵件隊列ID
        DECLARE @MailItemID INT ;
        --主題
        DECLARE @Subject NVARCHAR (100) = N'' ;
        --ER圖版本ID
        DECLARE @ERVerID INT ;
        --當前時間
        DECLARE @NowDate DATETIME ;

        --版本記錄表變量
        DECLARE @Temp_Table TABLE ( CombinSQL NVARCHAR (MAX)) ;
    END ;

    ---2.參數賦值(下面所有的BAcount_ER_Map_Version_DB替換成自己的郵箱)
    BEGIN
        SET @Account_SQL = ( SELECT Account + ';' FROM dbo.sp_MailAccount_Setting FOR XML PATH('')) ;
        SET @ERVerID = COALESCE(( SELECT MAX(ERVerID)FROM dbo.sp_ER_Mail_Record ), 0) ;

        IF NOT EXISTS ( SELECT * FROM BAcount_ER_Map_Version_DB.dbo.PMOBJT WHERE POID = 102 AND VCMT > @ERVerID )
            RETURN ;

        SET @Subject = (
                           SELECT MAX(A.NAME)FROM BAcount_ER_Map_Version_DB.dbo.PMOBJT A WHERE A.POID = 102
                       ) + N'項目ER圖新提交版本;' + CHAR(39) ;

        WITH CTE AS
        (
            SELECT ROW_NUMBER() OVER ( ORDER BY A.OCDT ) AS Ver,
                   A.VCMT,
                   A.OCDT,
                   B.TDAT
            FROM   BAcount_ER_Map_Version_DB.dbo.PMOBJT A
                   INNER JOIN BAcount_ER_Map_Version_DB.dbo.PMTEXT B ON A.VCMT = B.TXID
            WHERE
                   A.POID = 102
        ),
             CTE2 AS
        (
            SELECT ( CONVERT(NVARCHAR (100), DATEADD(HOUR, 8, CTE.OCDT), 20) + ' 提交Ver' + CONVERT(NVARCHAR (10), CTE.Ver) + '.0:' + CHAR(10) + CTE.TDAT )
                   + CHAR(10) AS CombinSQL
            FROM   CTE
            WHERE
                   CTE.VCMT > @ERVerID
        )
        INSERT INTO @Temp_Table ( CombinSQL ) SELECT CombinSQL FROM CTE2 ;

        SET @Body = ( SELECT CombinSQL + CHAR(10)FROM @Temp_Table FOR XML PATH('')) ;
        SET @NowDate = GETDATE() ;
    END ;

    ---3.發送郵件,並寫入日誌
    BEGIN
        EXECUTE [msdb].[dbo].[sp_send_dbmail] @profile_name = 'Send_ER_Mail',--(填入自己配置好的發送郵件)
                                              @recipients = @Account_SQL,
                                              @body = @Body,
                                              @subject = @Subject,
                                              @mailitem_id = @MailItemID OUTPUT ;

        --重新獲取最大ER版本ID
        SET @ERVerID = ( SELECT MAX(VCMT)FROM BAcount_ER_Map_Version_DB.dbo.PMOBJT ) ;

        INSERT INTO dbo.sp_ER_Mail_Record ( MailItemID, ERVerID, Recipient, Sender, MailSubject, MailBody, SendTime )
        SELECT @MailItemID,
               @ERVerID,
               Account,
               N'[email protected]',--(改成對應自己的發件郵箱)
               @Subject,
               @Body,
               @NowDate
        FROM   dbo.sp_MailAccount_Setting ;
    END ;
END ;

EXEC sp_MS_marksystemobject 'sp_Send_ER_Mail' ; --標識爲系統對象
GO

(4)表觸發器(在自己的倉庫數據庫執行)


CREATE TRIGGER dbo.PMTEXT_Insert_Trriger ON dbo.PMTEXT AFTER INSERT AS BEGIN
EXEC master.dbo.sp_Send_ER_Mail ;
END ;

3.配置發送郵件郵箱(本人用的QQ郵箱,推薦是幾個講的比較詳細博主,可以參考,這裏不做多贅述)

https://blog.csdn.net/jack8674/article/details/85058489

https://blog.csdn.net/HinKai/article/details/86525515

4.查看發送記錄

 

以上,就是我們配置實現E-R圖提交版本之後做郵箱自動推送提醒

------------原創,純手打,覺得對您有幫助的話,幫忙點個贊哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章