2013-09-16 81 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权限不适用于动态查询,您仍然会得到有关权限被拒绝的相同错误。尝试一下,看看自己。 –