2011-01-19 20 views
38

テーブルを切り捨てるために、MSSQLでユーザに付与する権限を取得するにはどのような権限が必要ですか?テーブルを切り捨てる権限

最小限の権限セットを許可しようとしていますが、テーブルが非常に大きく、操作をすばやくしたいので、DELETEを使用できません。

答えて

68

あなたはALTERパーミッションが必要です:パーミッションセクションhereを参照してください。

EXECUTE ASでストアドプロシージャを使用することもできます。そのため、ストアドプロシージャを実行しているユーザーには、ALTERパーミッションを付与する必要はありません。

+1

この回答は正しいだけでなく、ドキュメントを指すことによって「人を教えて」教えてくれたので、そのような回答は次のように見つけることができます。将来のOP。なぜdownvote? –

+2

@Ben - 質問が投稿された後、OPがこの回答を投稿したために疑いがあります。 FAQがこれを認めているので、私はdownvoteをしなかった。 –

+0

@Martin - ナノ秒ではありませんでした。それは2分だった - それは私が答えを見つけるのにどれくらいかかりました。 –

8

必要最小限のアクセス許可は、 テーブル名のALTERです。テーブル の所有者、sysadminのメンバーが固定 のサーバーロール、db_ownerおよび の固定データベースロールdb_ddladmin、および のテーブルへの既定のアクセス許可は、転送テーブル です。しかし、 は、 ストアドプロシージャなどのモジュール内にTRUNCATE TABLE ステートメントを組み込み、 モジュールに適切な権限をEXECUTE AS句を使用してモジュール に付与することができます。 の詳細については、EXECUTE ASを使用して にカスタム許可セットを作成するを参照してください。

Source

1

非表示、付与しないでください ...

CREATE TRIGGER TRG_MyTable_Foo 
WITH EXECUTE AS OWNER 
INSTEAD OF DELETE 
AS 
IF CONTEXT_INFO() = 0x9999 
BEGIN 
    TRUNCATE TABLE MyTable 
    SET CONTEXT_INFO 0x00 
END 
GO 

SET CONTEXT_INFO 0x9999 
DELETE MyTable WHERE 1=0 

SET CONTEXT_INFO かもしれは良くが通常はTRUNCATE表

からDELETEを分離するために、任意の疑いもなく

私はこれを試していません...

を編集:CONTEXT_INFOを使用するように変更しました。

+0

+1不快な驚きを引き起こさないようにするには、 'SET CONTEXT_INFO'が必須であると言いました! –

+1

-1これは、テーブルを切り捨てるゼロ行に当たる削除を行います。あなたはたいてい素晴らしい回答者ですが、これは維持できないハックです。 – Andomar

+0

@Andomar:はい、修正されました。私は完全にそれを考えなかったし、すぐに私の答えを更新したも – gbn

7

あなたはストアドプロシージャwith execute as owner作成することができます。そして、そのテーブルを切り捨てる必要が誰に実行権限を付与

create procedure dbo.TruncTable 
with execute as owner 
as 
truncate table TheTable 
go 

を:

exec dbo.TruncTable 
:今

grant execute on TruncTable to TheUser 

TheUserは次のようにテーブルを切り捨てることができます

0

ストアドプロシージャを作成するには、exec

CREATE PROCEDURE [dbo].[spTruncate] 
    @nameTable varchar(60) 
    WITH EXECUTE AS OWNER 
    AS 

SET NOCOUNT OFF; 
DECLARE @QUERY NVARCHAR(200); 

SET @QUERY = N'TRUNCATE TABLE ' + @nameTable + ';' 

EXECUTE sp_executesql @QUERY; 
+5

これは危険です! – Graeme

関連する問題