我正在使用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
答案 0 :(得分:1)
如果人们共享用户ID,则没有可靠的方法来保护数据。 Host_name是一个客户端参数,即使对于技术知识有限的人也很容易被欺骗。贵公司是否愿意承担人力资源/工资单数据可以修改的风险,而您无法分辨出谁真正做到了?无论谁对这个问题说“是”,请确保以书面形式或电子邮件发送并永久保存。
从您的回复中看,您可能对可用的登录数量有一些限制,并且您希望拥有的用户数多于登录数,但用户具有不同的角色和权限。如果您真的必须共享登录,建议您指定一个用于READ / WRITE,另一个用于READ。这样,您只与有权使用RW的用户共享RW的登录名/密码,并且只允许那些只允许阅读的用户使用R-login登录名/密码。从安全角度来看仍然是一个可怕的设置,但至少现在确保用户只能做他们允许的事情的责任被传递回用户。
仍然要确保有人在电子邮件中回复说,尽管您已经警告其风险并建议不这样做,但部署这种非常糟糕的安全模型是可以的。