none
Permissão para EXECUTE PROCEDURE SQL Server Express 2012 RRS feed

  • Pergunta

  • Fala galera, tudo bem?

    Estou montando uma rotina para backup automático no SQL Server Express 2012 de um cliente, quais passos eu segui:

    Primeiro criei a seguinte proc logado com usuário SA, pois com apenas Windows Autentication não tava rolando:

    USE [master]
    GO
    /****** Object:  StoredProcedure [dbo].[sp_BackupDatabases]    Script Date: 29/04/2013 16:55:53 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE PROCEDURE [dbo].[sp_BackupDatabases]  
                @databaseName sysname = null,
                @backupType CHAR(1),
                @backupLocation nvarchar(200) 
    AS 
     
           SET NOCOUNT ON; 
               
                DECLARE @DBs TABLE
                (
                      ID int IDENTITY PRIMARY KEY,
                      DBNAME nvarchar(500)
                )
               
                 -- Pick out only databases which are online in case ALL databases are chosen to be backed up
                 -- If specific database is chosen to be backed up only pick that out from @DBs
                INSERT INTO @DBs (DBNAME)
                SELECT Name FROM master.sys.databases
                where state=0
                AND name=@DatabaseName
                OR @DatabaseName IS NULL
                ORDER BY Name
               
                -- Filter out databases which do not need to backed up
                IF @backupType='F'
                      BEGIN
                      DELETE @DBs where DBNAME IN ('model')
                      END
                ELSE IF @backupType='D'
                      BEGIN
                      DELETE @DBs where DBNAME IN ('model')
                      END
                ELSE IF @backupType='L'
                      BEGIN
                      DELETE @DBs where DBNAME IN ('model')
                      END
                ELSE
                      BEGIN
                      RETURN
                      END
               
                -- Declare variables
                DECLARE @BackupName varchar(100)
                DECLARE @BackupFile varchar(100)
                DECLARE @DBNAME varchar(300)
                DECLARE @sqlCommand NVARCHAR(1000) 
            DECLARE @dateTime NVARCHAR(20)
                DECLARE @Loop int                  
                           
                -- Loop through the databases one by one
                SELECT @Loop = min(ID) FROM @DBs
     
          WHILE @Loop IS NOT NULL
          BEGIN
     
    -- Database Names have to be in [dbname] format since some have - or _ in their name
          SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'
     
    -- Set the current date and time n yyyyhhmmss format
          SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')  
     
    -- Create backup filename in path\filename.extension format for full,diff and log backups
          IF @backupType = 'F'
                SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'
          ELSE IF @backupType = 'D'
                SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'
          ELSE IF @backupType = 'L'
                SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'
     
    -- Provide the backup a name for storing in the media
          IF @backupType = 'F'
                SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime
          IF @backupType = 'D'
                SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime
          IF @backupType = 'L'
                SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime
     
    -- Generate the dynamic SQL command to be executed
     
           IF @backupType = 'F' 
                      BEGIN
                   SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, 
    
    NOFORMAT'
                      END
           IF @backupType = 'D'
                      BEGIN
                   SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', 
    
    NOSKIP, NOFORMAT'        
                      END
           IF @backupType = 'L' 
                      BEGIN
                   SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'  
    
          
                      END
     
    -- Execute the generated SQL command
           EXEC(@sqlCommand)
     
    -- Goto the next database
    SELECT @Loop = min(ID) FROM @DBs where ID>@Loop
     
    END
     

    Em seguida criei arquivos .BAT para rodar os backups via SQLCMD, exemplo para executar um FULL:

    sqlcmd -S .\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='D:\SQLBackups\',@backupType='L'"


    Porém está dando o seguinte erro de permissão:

    

    Duas dúvidas:

    1. No meu script para rodar o backup, estou rodando com o usuário local do Windows, ele realmente não tem muitas permissões, mas as de EXECUTE eu dei tanto em nível BANCO, TABELA, PROC e ESQUEMA, mas mesmo assim não rola, onde posso estar errando?  
    2. Eu tenho a senha de SA, porém não sei onde encaixo no meu script para rodar o backup, alguém sabe?

    Obs.: Testei isso no meu ambiente de teste e funcionou de boa, mas o meu usuário local da máquina tinha permissão FULL no SQL Server.

    Se alguém puder me ajudar!

    Abraços!

    sexta-feira, 3 de maio de 2013 17:23

Todas as Respostas

  • adicione a role db_backupOperator ao seu usuario na base em questão, acredito que deva funcionar.

    Alexandre Matayosi Conde Mauricio.

    • Sugerido como Resposta Roberson Naves sábado, 4 de maio de 2013 13:53
    sexta-feira, 3 de maio de 2013 19:54