Sql-Server

更改 SQL 代理運算符的字元限制

  • January 14, 2020

我想向 SQL Agent Operators 警報添加超過 100 個字元的電子郵件地址。

例如:emaione@example.com;emailtwo@example.com;emailthree@example.com;....

我試圖通過更改 sysoperators email_address 列來繞過 100 個字元的限制

ALTER TABLE sysoperators
ALTER column email_address NVARCHAR(1000);

然後創建我的操作員,但地址仍被截斷為 100 個字元?

僅僅因為你可以並不意味著你應該。請不要應用以下更改。這個答案只是為了向您展示為什麼您不應該更改系統表或系統過程以及可能出現的問題。

msdb.dbo.sp_add_operator

使用 ssms gui 添加運算符時,msdb.dbo.sp_add_operator在幕後呼叫。

使用的電子郵件地址參數也是nvarchar(100).

在此處輸入圖像描述

理論上,您可以通過更改程序來調整程序

然後將@email_address參數更改為nvarchar(1000)

在此處輸入圖像描述

如果我然後用 384 個字元(非 gui)執行它

USE [msdb]
GO
EXEC msdb.dbo.sp_add_operator @name=N'test', 
       @enabled=1, 
       @pager_days=0, 
       @email_address=N'emaione@example.com;emailtwo@example.com;emailthree@example.com;emaione@example.com;emailtwo@example.com;emailthree@example.com;emaione@example.com;emailtwo@example.com;emailthree@example.com;emaione@example.com;emailtwo@example.com;emailthree@example.com;emaione@example.com;emailtwo@example.com;emailthree@example.com;emaione@example.com;emailtwo@example.com;emailthree@example.com;'
GO

獲取長度:

select LEN(email_address)  as email_length
from sysoperators 
where name = 'test';

顯示有​​ 384 個字元。

email_length
384

然而,當通過 ssms 打開它時,立即破壞的事情之一是操作員列表:

在此處輸入圖像描述

由於 ssms 執行此查詢:

create table #tmp_sp_help_operator
(id int null, name nvarchar(128) null, enabled tinyint null, email_address nvarchar(100) null, last_email_date int null, last_email_time int null, pager_address nvarchar(100) null, last_pager_date int null, last_pager_time int null, weekday_pager_start_time int null, weekday_pager_end_time int null, saturday_pager_start_time int null, saturday_pager_end_time int null, sunday_pager_start_time int null, sunday_pager_end_time int null, pager_days tinyint null, netsend_address nvarchar(100) null, last_netsend_date int null, last_netsend_time int null, category_name nvarchar(128) null)
insert into #tmp_sp_help_operator exec msdb.dbo.sp_help_operator



SELECT
tsho.name AS [Name],
'Server[@Name=' + quotename(CAST(
       serverproperty(N'Servername')
      AS sysname),'''') + ']' + '/JobServer' + '/Operator[@Name=' + quotename(tsho.name,'''') + ']' AS [Urn],
CAST(tsho.enabled AS bit) AS [Enabled]
FROM
#tmp_sp_help_operator AS tsho
ORDER BY
[Name] ASC

drop table #tmp_sp_help_operator

說明為什麼我們不應該玩弄系統表和過程。

誰知道在更改表格和程序時什麼會起作用,什麼會破壞。

vonPryz提到的分發列表將是一個更好的解決方案。

引用自:https://dba.stackexchange.com/questions/257365