Які дозволи потрібні для обрізання таблиці?


14

У мене є база даних SQL із такими дозволами на базі даних:

введіть тут опис зображення

db_executorРоль , яку ви маєте доступ до цього рахунок , будучи членом був створений цим скриптом:

CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO

GRANT EXECUTE TO [db_executor] 
GO

Коли я побігати select, update, insertабо deleteна столі, вона працює відмінно. Коли я намагаюся ввести truncateтаблицю, вона видає мені це повідомлення про помилку:

Неможливо знайти об’єкт "TableName", оскільки він не існує або у вас немає дозволів.

У якому дозволі відсутній цей обліковий запис?


TRUNCATE TABLEє DDL, а не DML.
RBarryYoung

Відповіді:


26

Найкраще місце для пошуку цієї інформації - книги онлайн. У статті на TRUNCATE TABLE тут вказує:

Мінімальний необхідний дозвіл - ALTER на ім'я_мастера. Дозволи TRUNCATE TABLE за замовчуванням для власника таблиці, членів фіксованої ролі сервера sysadmin, а також фіксованих ролей бази даних db_owner та db_ddladmin і не підлягають передачі. Однак ви можете включити оператор TRUNCATE TABLE в модуль, такий як збережена процедура, і надати відповідні дозволи модулю за допомогою пункту EXECUTE AS.

Тож ALTER - це мінімальні необхідні дозволи. Ви можете отримати це як власник БД, ви можете отримати його як DB_DDLAdmin. Або просто дозволити змінити.

Якщо ви подумаєте про те, що робить усікання і як він працює, це має сенс, це досить «сувора» команда і випорожнює таблицю даних і робить це швидко.


12

Відповідно до цієї посилання в BOL :

Мінімальний необхідний дозвіл - ALTER на ім'я_мастера . Дозволи TRUNCATE TABLE за замовчуванням для власника таблиці , членів фіксованої ролі сервера sysadmin , а також фіксованих ролей бази даних db_owner та db_ddladmin і не підлягають передачі. Однак ви можете включити оператор TRUNCATE TABLE в модуль, такий як збережена процедура, і надати відповідні дозволи модулю за допомогою пункту EXECUTE AS.


3

Ви можете створити збережену процедуру з Execute як власника лише однієї таблиці або збережену процедуру в будь-якій таблиці. У наступному коді зберігається процедура для врізання будь-якої таблиці без надання дозволу 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;

це гарна ідея, але її можна було б вдосконалити. наприклад, додавши спробу..catch, інша річ - перевірка обмежень, спеціально сторонні ключі, також поля ідентичності, потрібно їх перезавантажити. ви можете мати все це у своїй процедурі. якщо ви це зробите, поділіться новим кодом. ;)
Марчелло Міореллі

1

Ви можете створити збережену процедуру з Execute як власника лише однієї таблиці або збережену процедуру в будь-якій таблиці. У наступному коді зберігається процедура для врізання будь-якої таблиці без надання дозволу 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

Наскільки я розумію, це скорочення - це не те, що можна відкатати. Тож Починати транзакцію / Здійснювати транзакцію не потрібно.


це неправда, і це легко перевірити, будь ласка, видаліть \ змінити цю відповідь
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
Марчелло Міореллі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.