【发布时间】:2015-11-02 03:58:32
【问题描述】:
我使用的是 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 和 Natalie。 Natalie 虽然是唯一不在 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
【问题讨论】:
-
不要使用触发器。 hr 人员是否有不同的 SQL 用户(不是主机、用户)?
-
他们拥有相同的用户。如果没有触发器,您将如何实现这一目标?
-
是的,他们应该有不同的用户,你可以限制用户使用/修改表。
-
可以使用triger,但我建议您应该从tblPayroll 表中创建一个视图,并对其进行触发。请参阅此处:technet.microsoft.com/en-us/library/…
-
那你有一个大问题。理想的解决方案是按照@PeterRing 所说的那样做。那是因为它将避免启动时潜在的安全问题:“什么会阻止用户在 tblAllowedUsers 上插入/更新”或什么会阻止用户(因为它是相同的)更改触发器本身。数据库角色系统是为此目的创建的,您应该使用它或解释您的公司为什么要使用它。
标签: sql sql-server triggers sql-server-2012