4

READ現在、SQL Server 2008 R2 を使用していますが、運用データを格納するいくつかのテーブルにしかアクセスできません。

多くの場合、次のようなものを実行して、影響を受けたレコードの合計数を取得できれば非常に便利であることがわかりました。

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

3

この更新で影響を受ける行数のみを調べている場合、それは現在WHERE条項に準拠している行数と同じになります。

SELECTしたがって、次のようにステートメントを実行できます。

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

結果の潜在的な行が影響を受けます。

于 2013-09-16T15:23:37.883 に答える
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 に答える