AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 290923
Accepted
Aleksey Vitsko
Aleksey Vitsko
Asked: 2021-05-04 08:06:22 +0800 CST2021-05-04 08:06:22 +0800 CST 2021-05-04 08:06:22 +0800 CST

SQL Server 登录触发器含义 - 在我的场景中是否有任何副作用?

  • 772

我团队中的一些开发人员知道具有扩展权限的 SQL 帐户的密码
我们希望在任何开发人员使用任何这些 SQL 帐户进行连接时进行跟踪并收到警报

我们即将logon trigger为每次登录尝试实施该功能,评估登录的属性,并在它们符合特定条件时发送电子邮件报告。逻辑如下:

如果 original_login() in (...SQL accounts list here...) 并且:
a) 客户端 IP 地址是 192.168.xx VPN 子网(没有生产应用程序从该子网连接,只有开发人员可以)或
b) 客户端主机名(... Dev 的主机名称列表...)或
c)(SSMS、az-Data 等)中的客户端应用程序名称
exec sp_send_dbmail(通过电子邮件向 DBA 发送报告)

触发器将具有“执行为”子句并代表 SQL 登录名运行,该登录名的唯一权限是发送 db 邮件电子邮件

在 Production 上启用这种登录触发器会产生什么不良副作用?
它会减慢登录过程或导致任何其他问题吗?

ps 我知道DAC以及如何使用它。
测试使用连接DAC并依靠它来帮助我在出现任何问题时禁用触发器

sql-server sql-server-2017
  • 3 3 个回答
  • 522 Views

3 个回答

  • Voted
  1. Best Answer
    David Browne - Microsoft
    2021-05-04T09:10:03+08:002021-05-04T09:10:03+08:00

    数据库邮件使用 Service Broker 队列和异步后台进程来实际发送电子邮件,因此性能应该不是什么大问题。但是登录触发器很容易导致停机,因此在编写和测试时需要非常小心。如果开发人员运行负载测试或类似的东西,您最终可能会收到数千封电子邮件。

    因此,为此使用登录触发器可能有点过头了。而是使用审计甚至只是一个 XEvent 会话。将数据写入事件文件并使用计划作业对其进行处理。

    以下是创建和查询审计的方法:

    --ALTER SERVER AUDIT [sa_successful_logon] WITH (STATE = OFF);
    --DROP SERVER AUDIT [sa_successful_logon]
    go
    
    declare @logFolder nvarchar(255) = ( select [path]  from sys.dm_os_server_diagnostics_log_configurations )
    exec('
    CREATE SERVER AUDIT [sa_successful_logon]
    TO  FILE ( FILEPATH = '''+@logFolder+''' )
    WHERE ([server_principal_name]=''sa'');
    ALTER SERVER AUDIT [sa_successful_logon] WITH (STATE = ON);
    ')
    GO
    
    CREATE SERVER AUDIT SPECIFICATION [sa_successful_logon_logon_spec]
    FOR SERVER AUDIT [sa_successful_logon]
    ADD (SUCCESSFUL_LOGIN_GROUP)
    WITH (STATE = ON)
    
    go
    
    declare @log nvarchar(255) = ( select [path] + 'sa_successful_logon*.sqlaudit' from sys.dm_os_server_diagnostics_log_configurations ) 
    SELECT event_time, client_ip, application_name
    FROM sys.fn_get_audit_file (@log,default,default);
    
    • 13
  2. Tibor Karaszi
    2021-05-05T04:30:48+08:002021-05-05T04:30:48+08:00

    一个方面可能不是您所要求的暗示类型,但 IMO 同样重要的是:

    应用程序名称和主机名由客户端应用程序设置。因此,您的开发人员可以使用 SSMS 轻松连接到您的 SQL Server,并在连接字符串中指定如下内容:

    应用程序名称=MyAppName;工作站 ID=MickeyMouse

    (您可以在 SSMS“连接”对话框中指定连接字符串属性。)

    我不能确定 IP 地址是否“安全”使用。

    • 1
  3. Viraj Sawant
    2021-05-07T02:39:34+08:002021-05-07T02:39:34+08:00

    你可以试试这个触发器:

    CREATE TRIGGER [logon_trigger_not_from_SSMS] 
    ON ALL SERVER FOR LOGON
    AS
      BEGIN
        IF APP_NAME() LIKE '%Microsoft SQL Server Management Studio%' --app name check
          BEGIN
          --the only persons allowed to use SSMS
            IF suser_name() not IN ('sa','DBA_LOGINS') 
            and suser_name() not like 'dev[_]%' 
                            
                 BEGIN
                    ROLLBACK --Logins other than above mention logins are not allowed to connect through SSMS
                 END 
          END 
                      
           
      END 
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve