データベースに対する次の権限を持つSQLアカウントを持っています。
db_executor
このアカウントがメンバーであるとわかるロールは、このスクリプトによって作成されました。
CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO
GRANT EXECUTE TO [db_executor]
GO
テーブルでselect
、update
、insert
またはdelete
を実行すると、正常に動作します。テーブルをtruncate
しようとすると、次のエラーメッセージが表示されます。
オブジェクト「TableName」が存在しないか、権限がないため、オブジェクトを見つけることができません。
このアカウントにはどのような権限がありませんか?
この情報を探すのに最適な場所は、オンラインブックです。 TRUNCATE TABLE
here に関する記事は、次のことを示しています。
必要な最小権限は、table_nameに対するALTERです。 TRUNCATE TABLE権限のデフォルトは、テーブル所有者、sysadmin固定サーバーロールのメンバー、およびdb_ownerとdb_ddladmin固定データベースロールであり、譲渡できません。ただし、ストアドプロシージャなどのモジュール内にTRUNCATE TABLEステートメントを組み込み、EXECUTE AS句を使用してモジュールに適切な権限を付与することができます。
したがって、ALTERは必要な最小限の権限です。これはDB所有者として取得できます。DB_DDLAdminとして取得できます。または単に変更を許可します。
切り捨ての機能とその仕組みについて考えると、これは理にかなっています。これはかなり「重大な」コマンドであり、データのテーブルを空にしてすばやく実行します。
BOLでのこの参照 に従って:
必要な最小権限はALTER on table_nameです。 TRUNCATE TABLE権限のデフォルトはテーブル所有者、sysadmin固定サーバーロールのメンバー、およびdb_ownerおよびdb_ddladminです。固定データベースロールであり、転送できません。ただし、ストアドプロシージャなどのモジュール内にTRUNCATE TABLEステートメントを組み込み、EXECUTE AS句を使用してモジュールに適切な権限を付与することができます。
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;
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;
私が理解している限り、切り捨てはロールバックできるものではありません。したがって、Begin Transaction/Commit Transactionは不要です。