SQL Server更新权限

SQL Server更新权限,sql,sql-server-2008,Sql,Sql Server 2008,我目前正在使用SQLServer2008R2,我只有READ权限访问一些存储生产数据的表 我发现,在许多情况下,如果我可以运行以下类似的操作,并获得受影响的总记录计数,那将是非常好的: USE DB GO BEGIN TRANSACTION UPDATE Person SET pType = 'retailer' WHERE pTrackId = 20 AND pWebId LIKE 'rtlr%'; ROLLBACK TRANSACTION 但是,由于我没有更新权限,我无法成功运行此脚

我目前正在使用SQLServer2008R2,我只有
READ
权限访问一些存储生产数据的表

我发现,在许多情况下,如果我可以运行以下类似的操作,并获得受影响的总记录计数,那将是非常好的:

USE DB
GO

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

ROLLBACK TRANSACTION
但是,由于我没有
更新
权限,我无法成功运行此脚本,除非获得:

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

  • 是否有任何方法可以配置我在SQL Server中的帐户,以便如果我想运行
    更新
    脚本,它将自动包装在具有回滚的事务中(因此实际上不会影响任何数据)

我知道我可以复制该数据并针对本地SSMS实例运行脚本,但我想知道是否有一种基于权限的方法来实现这一点。

我认为没有办法绕过SQL Server权限。我认为在生产数据库上开发不是一个好主意。最好有您使用的数据库的开发版本


如果受影响的行数是您所需的全部,则可以运行select而不是update

例如:

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

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

因此,您只需运行
SELECT
语句即可:

SELECT COUNT(pType) 
FROM Person WHERE pTrackId = 20 
AND pWebId LIKE 'rtlr%';
您将得到受影响的潜在行

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


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

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

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

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

我对我的问题进行了编辑,使其更集中于基于用户权限的解决方案。我希望我们的IT团队能够运行完全相同的查询,但实际上会影响数据集。。。如果没有办法做到这一点,那么这也足以作为一个答案。当从生产数据中提取时,我还喜欢将带有(NOLOCK)的
添加到来自
中。如果您认为将更新添加到存储过程是一个糟糕的主意,那么请不要建议它。@valverij这是一个有效的答案,只是我不推荐。我给出了不推荐的理由,希望能让人们得出自己的结论。更不用说,任何有自尊心的DBA都不会允许在他们的生产环境中出现这种情况,所以我认为这种情况不会发生。tl;医生:回答动态查询建议实际上不起作用。执行权限将不会应用于动态查询,并且您仍然会收到关于拒绝权限的相同错误。自己试试看。这将只计算
pType
不为空的行。OP的UPDATE语句中没有这样的条件,因此这可能会返回错误的结果。