我很确定没有办法,但我会把它放在那些我不知情的专家那里。
我要做的是在数据库级别执行之前以某种方式改变SELECT语句。对于一个严重减少的例子,我想做类似以下的事情...当有人执行以下SQL时
SELECT * FROM users.MESSAGES
我想在执行之前抓住它,并将语句改为
SELECT * FROM users.MESSAGES WHERE RECIPIENT = ORIGINAL_LOGIN()
允许我以类似于ORACLE的VPD的方式对数据实施用户限制,而不需要在我可能需要它的所有表上创建视图。
答案 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中执行此操作:
即便如此,我仍然怀疑你是否可以改变Select语句。
拉吉
免责声明:请自行承担风险。请注意,您正在对系统对象进行更改,这可能会导致不良结果。
答案 4 :(得分:0)
首先,不授予对用户的直接表访问权限,因此他们无法从即席查询中查看数据。让他们使用存储过程访问表,proc的一个参数是用户登录。然后编写代码,以便它只选择该登录的记录。