web-dev-qa-db-ja.com

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

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

enter image description here

db_executorこのアカウントがメンバーであるとわかるロールは、このスクリプトによって作成されました。

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

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

オブジェクト「TableName」が存在しないか、権限がないため、オブジェクトを見つけることができません。

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

14
Mansfield

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

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

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

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

26
Mike Walsh

BOLでのこの参照 に従って:

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

12
Thomas Stringer

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;
3
user3854427

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;
0
Yimy

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

0
Brian Clark