2009-06-26 77 views
0

我很確定沒有辦法,但是我爲那些超出我的知識的專家提供了這個方法。Sql Server修改選擇

我正在做的是以某種方式改變SELECT語句在數據庫級別執行之前執行。對於嚴重削減的例子,我想這樣做以下......當有人執行下面的SQL

SELECT * FROM users.MESSAGES 

我想抓住它,它執行前,並改變聲明爲類似

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

允許我執行在與Oracle的VPDs時裝數據用戶的限制,而無需求助於創造我所有的表,可能需要這樣的俯視圖。

回答

1

不幸的是,這是不可能的。

即使Microsoft SQL Server行級安全功能(例如安全目錄中)也是使用視圖實現的。

因此,如果您確實需要該功能,則必須在WHERE子句中使用SUSER_NAME()或類似的個人或角色標識符設置視圖。

對不起!

+0

啊,雞姦。所以我認爲這屬於「ORACLE通過Sql Server處理剩餘的少數事情(以及BEFORE觸發器進行數據清理)」。 噢,我有點不認爲有可能不訴諸額外的數據對象,但我想問問。 – eidylon 2009-06-26 21:17:48

2

使用VIEW進行調查。

0

使用視圖(或內聯表值函數),自動生成視圖並從表中刪除權限。

0

在SQL 2000中曾經存在一種循環不道德的方式。您可以在master..sysprocesses表上爲INSERT創建一個觸發器並執行這種操作。謝天謝地,在SQL 2005中,這是不可能的,至少AFAIK,作爲master..sysprocesses是假表。

對於我們中的一些還在使用SQL 2000的好處,這裏是如何做到這一點在SQL 2000:

  1. 在控制檯中右擊 服務器名
  2. 在屬性去服務器 設置選項卡
  3. 然後選中允許修改爲 直接對系統目錄 複選框。
  4. 選擇sysprocesses表中 系統對象並改變它的xtype 從S(系統)U(用戶)
  5. 現在去主數據庫,表 - 右 點擊sysprocesses中,所有 任務 - 管理觸發器
  6. 然後您可以編寫觸發器
  7. 完成後,將所有內容都恢復爲原始狀態。

即使所有這些,我仍然懷疑你是否可以改變Select語句。

拉吉

免責聲明:您自擔風險試試這個。被警告你正在對系統對象進行更改,這可能會導致不良結果。

0

首先,不向用戶授予直接表訪問權限,以便他們無法從即席查詢中查看數據。讓他們使用存儲的proc來訪問表,proc的其中一個參數是用戶登錄。然後編寫代碼,以便它只爲該登錄選擇記錄。