테이블을 자르려면 어떤 권한이 필요합니까?


14

데이터베이스에 대해 다음 권한이있는 SQL 계정이 있습니다.

여기에 이미지 설명을 입력하십시오

db_executor이 계정이 스크립트에 의해 만들어졌습니다의 회원이되는 참조 역할 :

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

나는를 실행하면 select, update, insert또는 delete테이블에, 그것을 잘 작동합니다. truncate테이블을 시도하면 다음과 같은 오류 메시지가 나타납니다.

"TableName"개체가 없거나 권한이 없기 때문에 개체를 찾을 수 없습니다.

이 계정에는 어떤 권한이 없습니까?


TRUNCATE TABLEDML이 아닌 DDL입니다.
RBarryYoung

답변:


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

소유자로 실행하여 하나의 테이블에만 저장 프로 시저를 생성하거나 모든 테이블에 저장 프로 시저를 생성 할 수 있습니다. 다음 코드에서는 권한을 부여하지 않고 테이블을 자르기위한 저장 프로 시저가 있습니다 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를 추가하면 제약 조건, 특히 외래 키 및 ID 필드를 확인하는 것이 중요합니다. 당신은 당신의 절차에서 모든 것을 가질 수 있습니다. 그렇게하면 새 코드를 공유하십시오. ;)
Marcello Miorelli

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ᵀᴹ September

@ ypercubeᵀᴹ-그는 SQL 주입으로부터 보호하기 위해 코드를 추가하여 이전 답변을 확장하고 있습니다.
Graeme

-1

내가 이해하는 한 자르기는 롤백 할 수있는 것이 아닙니다. 트랜잭션 시작 / 커밋 트랜잭션은 필요하지 않습니다.


이것은 사실이 아니며 테스트하기 쉽습니다.이 답변을 삭제 / 변경하십시오
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.