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圖提交版本之後做郵箱自動推送提醒
------------原創,純手打,覺得對您有幫助的話,幫忙點個贊哦!