2011-03-15 100 views
0

您好所有我想在,而不是插入创建触发器,它的语法如下隐藏在SQL Server中的触发器2005

create trigger HashPassword on PasswordTBl 
instead of insert 
as 
begin 
    insert into PasswordTBl (PasswordProxy) 
    select HashBytes('MD5', '@!'+PasswordProxy) 
    from inserted; 
    insert into master.dbo.PasswordTBl1(PasswordProxy) 
    select PasswordProxy from inserted; 
end 

由于几乎从触发清楚,我想存储的哈希原始表中的密码和备份表中的明文密码对所有用户都是隐藏的,但问题是匿名用户可以通过检查触发器知道辅助表名。

我将不胜感激,如果有人能提供给我一个方法来隐藏或加密该触发器或任何替代方法来达到同样的。

在此先感谢..

+0

如果您发布的代码,XML或数据样本,** **请在高亮文本编辑器的线和编辑器工具栏上的“代码示例”按钮('{}')点击很好的格式和语法高亮它! – 2011-03-15 08:03:58

+3

不是您的问题的答案,但_please_考虑不存储纯文本密码。如果用户丢失了密码,请随机生成一个密码并强制他/她在第一次连接时重置。 – Mat 2011-03-15 08:10:10

+0

@Mat:这可能是更明智的选择,的确如此! – 2011-03-15 08:11:04

回答

3

您不能隐藏触发 - 但你可以加密它的源代码,所以普通用户无法看到里面的内容:

create trigger HashPassword on PasswordTBl 
WITH ENCRYPTION 
instead of insert 
as 
begin 
    ...... 

这是一个简单,易于保护 - 但也相当薄弱;有办法再次解密该源代码。它可以保持远离偷偷摸摸的员工,但肯定不是一个意志坚定的黑客....

+0

感谢marc提供了如此快速的响应,现在它满足了我的要求,而黑客角度将在稍后考虑替代方案。 – Isha 2011-03-15 08:10:06

+1

@Isha:我不同意:修正你的权限,使代码不可见。这不会减损marc_s的回答。 – gbn 2011-03-15 08:18:49

+0

“普通用户”应该能够看到triger的定义! – gbn 2011-03-15 08:22:15

0

你的用户应该能够读取触发器定义,即使他们有权利INSERT/UPDATE/SELECT。如果可以的话,他们有太多的权利。

WITH ENCRYPTION仅混淆来自民间的代码权利已经。

参见GRANT VIEW DEFINITIONOneTwoThree。请注意,这是由ALTER和db_owner权限隐含的。

一个问题:如果有人能看到代码,他们很可能会看到你的备份表。即使是在主用户需要有权利写进去的表,因为它是一个不同的数据库。

如果您还没有授予权掌握在用户或公众,那么这意味着系统管理员权限。这意味着有人可以撤消WITH ENCRYPTION容易

乖乖,这是错误的这么多层次。