CREATE TRIGGER TR_check_ip_address
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @ip_addr varchar(48)
SELECT @ip_addr = client_net_address
FROM sys.dm_exec_connections
WHERE session_id = @@SPID
IF ORIGINAL_LOGIN() = 'bob' AND @ip_addr <> '127.0.0.1'
ROLLBACK;
END
如果您尝试从未经授权的 IP 连接,则会收到错误消息:
Logon failed for login 'bob' due to trigger execution.
请记住,登录触发器可能是邪恶的,并且可能最终将所有人锁定在实例之外。当心!
但是,我认为您实际上并不需要这样做。如果要启用来自已知地址列表的连接,防火墙是最适合这项工作的工具。可能发生的最糟糕的事情是错误的用户从已知的 IP 地址连接,如果用户小心保存他们的凭据,这是不太可能发生的。
USE master
GO
-- Create table to hold valid IP values
CREATE TABLE ValidIPAddress (IP NVARCHAR(15)
CONSTRAINT PK_ValidAddress PRIMARY KEY)
-- Declare local machine as valid one
INSERT INTO ValidIPAddress
SELECT '<local machine>'
-- Create Logon Trigger to stop logins from invalid IPs
CREATE TRIGGER tr_LogOn_CheckIP ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @IPAddress NVARCHAR(50) ;
SET @IPAddress = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]',
'NVARCHAR(50)') ;
IF NOT EXISTS ( SELECT IP
FROM master..ValidIPAddress
WHERE IP = @IPAddress )
BEGIN
-- If login is not a valid one, then undo login process
SELECT @IPAddress
ROLLBACK --Undo login process
END
END
您可以为此使用登录触发器。
如果您尝试从未经授权的 IP 连接,则会收到错误消息:
请记住,登录触发器可能是邪恶的,并且可能最终将所有人锁定在实例之外。当心!
但是,我认为您实际上并不需要这样做。如果要启用来自已知地址列表的连接,防火墙是最适合这项工作的工具。可能发生的最糟糕的事情是错误的用户从已知的 IP 地址连接,如果用户小心保存他们的凭据,这是不太可能发生的。
另外,考虑到 IP 地址可能会被欺骗,所以我不确定您将提供何种程度的额外安全性。
您可以使用以下登录触发器来实现此目的
创建触发器后,您可以在 Server Objects --> Triggers 选项卡下找到它
来自我的博客 connectsql.com