6 个月以来,我的链接服务器在 SQL Server 中正常工作。一切正常,但奇怪的事情开始发生。一周前,我被告知同步无法正常工作。我发现链接的服务器已经消失了。我再次添加了它们,但 3 天后又添加了,但 3 天后它们又消失了。
我没有手动删除它们。
有没有可能是什么东西把它们去掉了?
如何防止自动删除?
Windows 服务器 2019、SQL 服务器 2017
6 个月以来,我的链接服务器在 SQL Server 中正常工作。一切正常,但奇怪的事情开始发生。一周前,我被告知同步无法正常工作。我发现链接的服务器已经消失了。我再次添加了它们,但 3 天后又添加了,但 3 天后它们又消失了。
我没有手动删除它们。
有没有可能是什么东西把它们去掉了?
如何防止自动删除?
Windows 服务器 2019、SQL 服务器 2017
创建一个包含跟踪操作的表,例如:
CREATE TABLE EventLogTable (
EventLogTableID INT IDENTITY PRIMARY KEY,
EventType NVARCHAR(100),
PostTime DATETIME,
SPID INT,
ServerName NVARCHAR(100),
LoginName NVARCHAR(100),
ObjectName NVARCHAR(100),
ObjectType NVARCHAR(100),
[Parameters] NVARCHAR(1000),
TargetObjectName NVARCHAR(100),
TargetObjectType NVARCHAR(100),
TSQLCommand NVARCHAR(1000))
然后通过EVENTDATA()函数创建一个监控链接服务器事件的 DDL 服务器触发器:
CREATE TRIGGER utrLogLinkedServerOperations ON ALL SERVER FOR
CREATE_LINKED_SERVER,
DROP_LINKED_SERVER,
ALTER_LINKED_SERVER
AS
BEGIN
DECLARE @EventXML XML = EVENTDATA()
INSERT INTO EventLogTable (
EventType,
PostTime,
SPID,
ServerName,
LoginName,
ObjectName,
ObjectType,
[Parameters],
TargetObjectName,
TargetObjectType,
TSQLCommand)
SELECT
EventType = @EventXML.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
PostTime = @EventXML.value('(/EVENT_INSTANCE/PostTime)[1]', 'nvarchar(100)'),
SPID = @EventXML.value('(/EVENT_INSTANCE/SPID)[1]', 'nvarchar(100)'),
ServerName = @EventXML.value('(/EVENT_INSTANCE/ServerName)[1]', 'nvarchar(100)'),
LoginName = @EventXML.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'),
ObjectName = @EventXML.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(100)'),
ObjectType = @EventXML.value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(100)'),
[Parameters] = @EventXML.value('(/EVENT_INSTANCE/Parameters)[1]', 'NVARCHAR(1000)'),
TargetObjectName = @EventXML.value('(/EVENT_INSTANCE/TargetObjectName)[1]','nvarchar(100)'),
TargetObjectType = @EventXML.value('(/EVENT_INSTANCE/TargetObjectType)[1]', 'nvarchar(100)'),
TSQLCommand = @EventXML.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(1000)')
END
您可以在此处找到 XML 模式。确保启用触发器:
ENABLE TRIGGER utrLogLinkedServerOperations ON ALL SERVER
现在尝试创建、修改和删除一些链接服务器,以检查触发器是否正确地在表中创建日志。然后等待忍者攻击。
您也可以在触发器内回滚操作,但请注意,您可能最终甚至不允许所需的进程来操作链接的服务器。
删除链接服务器需要ALTER ANY LINKED SERVER
权限。
要找出谁可以做到这一点,您应该permission
在服务器级别找到谁拥有它(我在 中搜索的第二个查询sys.server_permissions
)。很少有人明确授予此权限,因此您也应该在其中sysadmins
进行搜索setupadmins
。
我还包括control server
有权进行我的搜索的委托人。
请注意,即使您可以设置DDL-trigger
某人,control server
或者sysadmin
可以在他想要放下linked servers
而不被捕获时轻松禁用它。
select sp.name as RoleName,
member.name as MemberName
from sys.server_role_members rm
join sys.server_principals as sp
on rm.role_principal_id = sp.principal_id
join sys.server_principals as member
on rm.member_principal_id = member.principal_id
where sp.name in ('sysadmin', 'setupadmin');
select suser_name(grantee_principal_id), permission_name
from sys.server_permissions
where permission_name in ('ALTER ANY LINKED SERVER', 'CONTROL SERVER');