2013-09-16 82 views
4

我目前正在使用SQL Server 2008 R2,並且我只有READ訪問了一些存放生產數據的表。SQL Server更新權限

我發現,在很多情況下,這將是非常不錯的,如果我可以運行類似於以下,並獲得總記錄數回已經影響:

USE DB 
GO 

BEGIN TRANSACTION 
UPDATE Person 
SET pType = 'retailer' 
WHERE pTrackId = 20 
AND pWebId LIKE 'rtlr%'; 

ROLLBACK TRANSACTION 

不過,看到我沒有UPDATE允許,我不能成功沒有得到運行此腳本:

Msg 229, Level 14, State 5, Line 5 
The UPDATE permission was denied on the object 'Person', database 'DB', schema 'dbo'. 

我的問題:

  • 是否有我的SQL Server帳戶可以配置成,如果我想運行一個UPDATE腳本,它會自動被包裹在一個事務與回滾(所以沒有數據實際影響)
任何方式

我知道我可以製作一份該數據的副本,並針對本地SSMS實例運行我的腳本,但我想知道是否有基於許可的方式來完成此操作。

+0

我編輯我的問題圍繞基於用戶許可的解決方案更加集中。我想讓我們的IT團隊能夠運行完全相同的查詢,但實際上會影響數據集......如果沒有辦法做到這一點,那麼這將足以作爲答案以及。 – X3074861X

回答

3

我不認爲有一種方法可以繞過SQL Server權限。無論如何,我認爲在生產數據庫上開發並不是一個好主意。擁有您使用的數據庫的開發版本會更好。


如果受影響的行數是你需要的,那麼你可以運行select而不是update。

例如:

select count(*) 
from Person 
where pTrackId = 20 
AND pWebId LIKE 'rtlr%'; 
+2

從生產數據中提取數據時,我也希望在FROM中添加一個WITH(NOLOCK)' – valverij

3

如果你只是將與此更新受到影響的行數之後是,這將是目前符合到WHERE條款的行相同。

所以,你可以只運行一個SELECT語句,例如:

SELECT COUNT(pType) 
FROM Person WHERE pTrackId = 20 
AND pWebId LIKE 'rtlr%'; 

而且你會得到影響導致的可能行。

+0

這隻會對'pType'不爲空的行進行計數。在OP的UPDATE語句中沒有這樣的條件,所以這可能會返回不正確的結果。 –

0

1.首先以管理員身份在sqlserver中登錄
2.登錄 - >您的名字 - >檢查角色。
3.IF你有寫權限,那麼你可以完成上述任務。
4.如果不確定授予寫入權限。

0

如果嚴格需要嘗試更新,則可以編寫一個存儲過程,接受動態SQL作爲字符串(您的UPDATE查詢)並將動態SQL包裝到事務上下文中,然後再回滾。您的帳戶可以被授予對該存儲過程的訪問權限。個人而言,我認爲這是一個糟糕的主意,而且令人難以置信的是不安全 - 一些查詢跳出了這種事務上下文(例如ALTER TABLE)。你可能能夠以某種方式阻止這些,但它仍然是一個安全/審計問題。

我建議寫一個查詢來計算相關行:

SELECT COUNT(*) 
FROM --tables 
WHERE --your where clause 
-- any other clauses here e.g. GROUP BY, HAVING ... 
+0

如果您認爲將更新添加到存儲過程是一個糟糕的主意,那麼請不要提示它。 – valverij

+0

@valverij這是一個有效的答案 - 只是我不推薦。我給出了我不推薦它的原因,希望能夠讓人們得出他們自己的結論。更何況,任何自尊自愛的DBA都不會在他們的生產環境中允許這樣的事情,所以我不認爲這會發生。 tl; dr:answer!=建議IMO。 – penguat

+0

動態查詢建議不會真正起作用。 EXECUTE權限不適用於動態查詢,您仍然會得到有關權限被拒絕的相同錯誤。嘗試一下,看看自己。 –