Sql Server修改选择

时间:2009-06-26 19:42:54

标签: sql sql-server sql-server-2005

我很确定没有办法,但我会把它放在那些我不知情的专家那里。

我要做的是在数据库级别执行之前以某种方式改变SELECT语句。对于一个严重减少的例子,我想做类似以下的事情...当有人执行以下SQL时

SELECT * FROM users.MESSAGES 

我想在执行之前抓住它,并将语句改为

SELECT * FROM users.MESSAGES WHERE RECIPIENT = ORIGINAL_LOGIN()

允许我以类似于ORACLE的VPD的方式对数据实施用户限制,而不需要在我可能需要它的所有表上创建视图。

5 个答案:

答案 0 :(得分:2)

使用VIEW

答案 1 :(得分:1)

可悲的是,这是不可能的。

甚至Microsoft SQL Server行级安全功能(例如在安全目录中)也是使用视图实现的。

因此,如果您确实需要该功能,则必须在WHERE子句中使用SUSER_NAME()或某些类似的个人或角色标识符设置视图。

抱歉!

答案 2 :(得分:0)

使用视图(或内联表值函数),自动生成视图并从表中删除权限。

答案 3 :(得分:0)

在SQL 2000中曾经存在一种循环不道德的方式。您可以在master..sysprocesses表上为INSERT创建一个触发器并执行此类操作。值得庆幸的是,这在SQL 2005中是不可能的,至少是AFAIK,因为master..sysprocesses是一个假表。

为了一些仍在使用SQL 2000的美国人的利益,这里是如何在SQL 2000中执行此操作:

  1. 在控制台中右键单击 服务器名
  2. 在属性中转到服务器 设置标签
  3. 然后检查允许修改 直接制作系统目录 复选框。
  4. 选择了sysprocesses表 sysobjects并改变它的xtype 从S(系统)到U(用户)
  5. 现在转到Master DB,表 - 右边 单击sysprocesses-All 任务 - 管理触发器
  6. 然后你可以编写你的触发器
  7. 完成后,转回去 一切都是它的原始状态。
  8. 即便如此,我仍然怀疑你是否可以改变Select语句。

    拉​​吉

    免责声明:请自行承担风险。请注意,您正在对系统对象进行更改,这可能会导致不良结果。

答案 4 :(得分:0)

首先,不授予对用户的直接表访问权限,因此他们无法从即席查询中查看数据。让他们使用存储过程访问表,proc的一个参数是用户登录。然后编写代码,以便它只选择该登录的记录。