テーブルを切り捨てるにはどのような権限が必要ですか?


14

データベースに対する次の権限を持つSQLアカウントを持っています。

ここに画像の説明を入力してください

db_executorこのアカウントは、このスクリプトによって作成されたの一員として見役割:

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

テーブルで、、またはを実行するselectupdate、正常に動作します。テーブルにアクセスしようとすると、次のエラーメッセージが表示されます。insertdeletetruncate

オブジェクト "TableName"が存在しないか、権限がないため、見つかりません。

このアカウントにはどのような権限がありませんか?


TRUNCATE TABLEDMLではなくDDLです。
RBarryYoung 2013年

回答:


26

この情報を探すのに最適な場所は、オンラインブックです。ここの記事は次のTRUNCATE TABLE ことを示してます。

必要な最小権限は、table_nameに対するALTERです。TRUNCATE TABLE権限のデフォルトは、テーブル所有者、sysadmin固定サーバーロールのメンバー、およびdb_ownerとdb_ddladmin固定データベースロールであり、転送できません。ただし、ストアドプロシージャなどのモジュール内にTRUNCATE TABLEステートメントを組み込み、EXECUTE AS句を使用して適切な権限をモジュールに付与することができます。

したがって、ALTERは必要な最小限の権限です。これはDB所有者として取得できます。DB_DDLAdminとして取得できます。または単に変更を許可します。

切り捨ての機能とその仕組みについて考えると、これは理にかなっています。これはかなり「深刻な」コマンドであり、データのテーブルを空にしてすばやく実行します。


12

BOLのこのリファレンスに従って:

必要な最小権限はtable_nameに対するALTERです。TRUNCATE TABLE権限は、デフォルトでテーブル所有者sysadmin固定サーバーロールのメンバー、およびdb_ownerdb_ddladmin固定データベースロールに割り当てられており、転送できません。ただし、ストアドプロシージャなどのモジュール内にTRUNCATE TABLEステートメントを組み込み、EXECUTE AS句を使用して適切な権限をモジュールに付与することができます。


3

1つのテーブルのみに対して所有者として実行するストアドプロシージャ、または任意のテーブルに対してストアドプロシージャを作成できます。次のコードには、db_ownerまたはその他の権限を割り当てずにテーブルを切り捨てるストアドプロシージャがあります。

USE [database name]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      Yimy Orley Asprilla
-- Create date: Julio 16 de 2014
-- Description: Función para hacer TRUNCATE a una tabla.
-- =============================================
ALTER 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;

これは良い考えですが、かなり改善される可能性があります。たとえば、try..catchを追加すると、もう1つは制約、特に外部キー、およびIDフィールドをチェックして、それらを再シードする必要があることです。あなたはあなたの手順でそれらすべてを持つことができます。その場合は、新しいコードを共有してください。;)
マルチェロミオレッリ2015

1

1つのテーブルのみに対して所有者として実行するストアドプロシージャ、または任意のテーブルに対してストアドプロシージャを作成できます。次のコードでは、db_ownerまたはその他の権限を割り当てずにテーブルを切り捨てるストアドプロシージャが含まれています。このバージョンのSPには、エラーの処理とSQLインジェクションの防止が含まれています

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


/****** Se validan el parametro de entrada @strTabla para evitar un SQL inyección, Yimy Asprilla ******/
CREATE PROCEDURE [dbo].[spTruncate] 
        @strTabla VARCHAR(50)
WITH EXECUTE AS OWNER
AS
-- =============================================
 -- Author:  Yimy Asprilla
 -- Create date: Julio 16 de 2014
 -- Update: September 21 2017
 -- Description: Función para hacer TRUNCATE a una tabla si ser owner de la tabla. con manejo de errores y SQL Inyection
 -- =============================================
SET NOCOUNT ON

DECLARE @strSQL VARCHAR(500);
DECLARE @object_id int;

SET @object_id = OBJECT_ID(@strTabla);

BEGIN TRY
    IF @object_id IS NOT NULL 
        BEGIN;
            BEGIN TRANSACTION;
            SET @strSQL = 'TRUNCATE TABLE [' + @strTabla + '];'
            EXECUTE (@strSQL);
            COMMIT TRANSACTION;
        END;
    ELSE
    BEGIN;
        PRINT N'La Tabla: ' + @strTabla + ' No existe';
    END;
END TRY
BEGIN CATCH  
    -- se presento un error en la ejcución y s epresenta
    PRINT N'Se presento el error: ';
    SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage;   
END CATCH;

1
これは、別の回答のコードと非常に似ています。あなたはあの人と同じユーザーですか?
ypercubeᵀᴹ

@ypercubeᵀᴹ-彼はSQLインジェクションから保護するためのコードを追加することにより、前述の回答を拡張しています。
Graeme

-1

私が理解している限り、切り捨てはロールバックできるものではありません。したがって、Begin Transaction / Commit Transactionは不要です。


これは真実ではなく、テストするのは簡単です。この回答を削除または変更してください
Marcello Miorelli

BEGIN TRANSACTION RADHE SELECT @@TRANCOUNT select * from [dbo].[mytable] truncate table [dbo].[mytable] rollback select * from [dbo].[mytable] /*COMMIT TRAN RADHE*/ SELECT @@TRANCOUNT
Marcello Miorelli
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.