创建一个而不是触发器,以允许某些用户修改表

时间:2015-08-10 09:33:30

标签: sql sql-server triggers sql-server-2012

我正在使用SQL Server 2012。

我正在尝试编写我的第一个触发器。

我有两张桌子,一张叫做tblPayroll&另一个叫做tblAllowedUsers。以下是他们看起来的快速视图,

 tblPayroll                                    tblAllowedUsers

 employee  salary  position  hr person         hr person    host_name
 abc       5       manager   Sally             Sally        EXABC456
 jkl       3       admin     Dave              Dave         EXDFG908
 plk       4       admin     Sally
 ppp       8       admin     Natalie
 lmn       3       manager   Dave

所以在我的例子中有3个用户,Sally,Dave&娜塔莉。但娜塔莉是唯一不在tblAllowedUsers表中的人。

所以我希望tblAllowedUsers表中的任何人能够修改,插入或删除tblPayroll表中的任何记录。

对于不在tblAllowedUsers表中的人(即Natalie),虽然我不希望他们能够修改,插入或删除员工是tblPayroll表中的经理的记录。

在这种情况下,是否触发正确的触发器?我知道在触发器中我需要使用HOST_NAME()函数来查看哪个用户正在执行语句。

我相信触发器的外壳应该是下面的内容,

create trigger trDefaultPath on MatlabSearchPath
instead of insert, update, delete
as
begin

end

在中间部分,我需要类似下面的内容,

if postion = 'manager'   -- need to check who is running this

    if HOST_NAME() IN tblAllowedUsers
        -- then execute the statement
    else
        -- give an error message
    end
else
  -- then execute the statement
end

1 个答案:

答案 0 :(得分:1)

如果人们共享用户ID,则没有可靠的方法来保护数据。 Host_name是一个客户端参数,即使对于技术知识有限的人也很容易被欺骗。贵公司是否愿意承担人力资源/工资单数据可以修改的风险,而您无法分辨出谁真正做到了?无论谁对这个问题说“是”,请确保以书面形式或电子邮件发送并永久保存。

从您的回复中看,您可能对可用的登录数量有一些限制,并且您希望拥有的用户数多于登录数,但用户具有不同的角色和权限。如果您真的必须共享登录,建议您指定一个用于READ / WRITE,另一个用于READ。这样,您只与有权使用RW的用户共享RW的登录名/密码,并且只允许那些只允许阅读的用户使用R-login登录名/密码。从安全角度来看仍然是一个可怕的设置,但至少现在确保用户只能做他们允许的事情的责任被传递回用户。

仍然要确保有人在电子邮件中回复说,尽管您已经警告其风险并建议不这样做,但部署这种非常糟糕的安全模型是可以的。