【问题标题】:Is there a way to find out the user that submitted a SQL query?有没有办法找出提交 SQL 查询的用户?
【发布时间】:2010-03-25 19:38:33
【问题描述】:

我有兴趣编写一个触发器,该触发器将忽略来自特定 SQL 用户的查询,但对所有其他用户执行操作。有没有办法做到这一点?

但请注意:用户需要进行一些查询,所以我需要允许一些查询/删除/等。

【问题讨论】:

  • 这可能在安全级别上处理得更好,即不要让 that 用户插入、删除、选择等。(感觉就像一个触发器会矫枉过正; 如果一开始就不允许该用户与该表进行交互,则其他用户的处理时间根本不会受到影响。)
  • 触发器不能阻止 SELECT,只有安全可以

标签: sql sql-server


【解决方案1】:

只需将他们的权限调整为不包括选择以及您希望阻止他们执行的任何其他操作。

【讨论】:

    【解决方案2】:

    如果您现在有一个不想触发的触发器(我们在移动大量数据时对审计触发器执行了此操作),您可以在触发器开始时执行以下操作:

    if (suser_sname() = 'somename') return
    

    如果您想为那个人做一些不同的事情,您可以这样做:

    if (suser_sname() = 'somename) 
    BEGIN
        some code
    END
    ELSE
    BEGIN
        someother code
    END
    

    请注意有关此的几件事。 非常谨慎使用此代码。首先,如果您可以通过担保权做您需要的事情,这是一个更好的选择。将某人的名字硬编码到触发器中可能会在以后的某个时候导致奇怪的结果,因为所有人都忘记了你把它放在那里。如果您需要在短期内完成(例如,在一段时间内将 100,000,000 亿条记录分批移动到数据库中而不会触发 auidit 触发器),那么不要忘记在项目完成时将其改回。您不想永远不审计某人的行为,尤其是在审计金融交易时。此外,在触发器中执行某些操作仅适用于插入/更新/删除。您无法阻止从触发器中进行选择。

    【讨论】:

    • 不需要硬编码,你可以将用户存储在表中并使用IF EXISTS (SELECT username FROM BadBadBadUsers WHERE suser_sname()=BadUserName)。我喜欢你使用suser_name()的想法!
    【解决方案3】:

    尝试使用:

     SELECT SUSER_NAME()
    

    SUSER_NAME (Transact-SQL)

    【讨论】:

      【解决方案4】:

      内置的 USER 函数怎么样:

      If USER <> [your case]
      Begin
        Do Stuff
      End
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-21
        • 2019-07-06
        • 1970-01-01
        • 2019-12-25
        • 1970-01-01
        • 2015-07-12
        • 2021-06-21
        • 1970-01-01
        相关资源
        最近更新 更多