4

我目前正在使用 SQL Server 2008 R2,我只能READ访问一些包含生产数据的表。

我发现在许多情况下,如果我可以运行类似以下的内容并获得受影响的总记录数,那就太好了:

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 实例运行我的脚本,但我想知道是否有基于权限的方法来完成此操作。

4

4 回答 4

4

我认为没有办法绕过 SQL Server 权限。而且我认为无论如何在生产数据库上开发都不是一个好主意。拥有您使用的数据库的开发版本会更好。


如果您只需要受影响的行数,那么您可以运行 select 而不是 update。

例如:

select count(*)
from Person
where pTrackId = 20 
AND pWebId LIKE 'rtlr%';
于 2013-09-16T15:20:36.470 回答
3

如果您只关注受此更新影响的行数,那么这将与当前符合该WHERE子句的行数相同。

所以你可以SELECT像这样运行一个语句:

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

你会得到受影响的潜在行。

于 2013-09-16T15:23:37.883 回答
0

1.首先在sqlserver中以管理员身份登录2.转到登录
->您的姓名->检查角色。
3.如果你有写权限,那么你可以完成上述任务。
4.如果不确定,请确保您授予写入权限。

于 2013-09-17T07:29:13.450 回答
0

如果绝对有必要尝试更新,您可以编写一个存储过程,接受动态 SQL 作为字符串(您的 UPDATE 查询)并将动态 SQL 包装在事务上下文中,然后回滚。然后可以授予您的帐户访问该存储过程的权限。

就个人而言,我认为这是一个糟糕的想法,而且非常不安全——一些查询会脱离这样的事务上下文(例如 ALTER TABLE)。您可能能够以某种方式阻止它们,但这仍然是一个安全/审计问题。

我建议编写一个查询来计算相关行:

SELECT COUNT(*) 
FROM --tables
WHERE --your where clause
-- any other clauses here e.g. GROUP BY, HAVING ...
于 2013-09-17T10:31:40.410 回答