Перейти к содержанию

Полезные SQL скрипты для 1С

Материал из Wiki Sestrica
  • Создание учетки на sql-сервере и добавление в базы данных
-- =============================================
-- Параметры (изменяйте только здесь)
-- =============================================
DECLARE @LoginName  NVARCHAR(128) = N'login_name';
DECLARE @Password   NVARCHAR(128) = N'password';
DECLARE @Databases  NVARCHAR(MAX) = N'base1,base2,base3,base4';  -- базы через запятую

-- =============================================
-- Основная логика (не меняйте)
-- =============================================

SET NOCOUNT ON;

DECLARE @SQL NVARCHAR(MAX);

-- 1. Создание логина на уровне сервера
SET @SQL = N'
USE master;
CREATE LOGIN ' + QUOTENAME(@LoginName) + N' 
    WITH PASSWORD = ' + QUOTENAME(@Password, '''') + N';';

EXEC sp_executesql @SQL;

PRINT 'Логин ' + @LoginName + ' успешно создан.';

-- 2. Предоставление права ALTER TRACE
SET @SQL = N'GRANT ALTER TRACE TO ' + QUOTENAME(@LoginName) + N';';
EXEC sp_executesql @SQL;

PRINT 'Право ALTER TRACE выдано.';

-- 3. Обработка каждой базы данных
DECLARE @DBName NVARCHAR(128);
DECLARE @Cur CURSOR;

SET @Cur = CURSOR LOCAL FAST_FORWARD FOR
    SELECT TRIM(value) 
    FROM STRING_SPLIT(@Databases, ',');

OPEN @Cur;
FETCH NEXT FROM @Cur INTO @DBName;

WHILE @@FETCH_STATUS = 0
BEGIN
    IF DB_ID(@DBName) IS NOT NULL
    BEGIN
        SET @SQL = N'
USE ' + QUOTENAME(@DBName) + N';
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = ' + QUOTENAME(@LoginName, '''') + N')
    CREATE USER ' + QUOTENAME(@LoginName) + N' FOR LOGIN ' + QUOTENAME(@LoginName) + N';

ALTER ROLE db_datareader ADD MEMBER ' + QUOTENAME(@LoginName) + N';';

        EXEC sp_executesql @SQL;
        
        PRINT 'Пользователь создан и добавлен в db_datareader в базе: ' + @DBName;
    END
    ELSE
    BEGIN
        PRINT 'Предупреждение: База ' + @DBName + ' не найдена!';
    END

    FETCH NEXT FROM @Cur INTO @DBName;
END

CLOSE @Cur;
DEALLOCATE @Cur;

PRINT 'Скрипт выполнен успешно.';
  • Создание пользователя на sql-сервере (устаревшая версия):
USE master;
GO

-- Создание логина для сервера
CREATE LOGIN login_name WITH PASSWORD = 'passwors';
GO

-- Предоставление разрешения ALTER TRACE (уровень сервера)
GRANT ALTER TRACE TO login_name;
GO

USE torg_sm;
GO

-- Создание пользователя в базе данных и привязка к логину
CREATE USER login_name FOR LOGIN login_name;
GO

-- Выдача прав на чтение в целевой базе данных
ALTER ROLE db_datareader ADD MEMBER login_name;
GO

USE torg_cb;
GO

-- Создание пользователя в базе данных и привязка к логину
CREATE USER login_name FOR LOGIN login_name;
GO

-- Выдача прав на чтение в целевой базе данных
ALTER ROLE db_datareader ADD MEMBER login_name;
GO
  • Удаление пользователя с SQL-сервера и из всех баз:
DECLARE @LoginName NVARCHAR(128) = 'alexandr_rychkov';  -- укажите имя пользователя/логина
DECLARE @Sql NVARCHAR(MAX);

-- Курсор по всем пользовательским базам (исключая системные)
DECLARE db_cursor CURSOR FOR
    SELECT name FROM sys.databases
    WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb', 'distribution')
      AND state = 0;   -- только онлайн-базы

OPEN db_cursor;
DECLARE @DBName NVARCHAR(128);
FETCH NEXT FROM db_cursor INTO @DBName;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Sql = N'
        USE [' + @DBName + N'];
        BEGIN TRY
            IF EXISTS (SELECT 1 FROM sys.database_principals WHERE name = ''' + @LoginName + N''' AND type IN (''S'', ''U'', ''G''))
            BEGIN
                DROP USER [' + @LoginName + N'];
                PRINT ''Пользователь "'' + ''' + @LoginName + N''' + ''" удалён из базы "'' + DB_NAME() + ''"'';
            END
            ELSE
            BEGIN
                PRINT ''Пользователь "'' + ''' + @LoginName + N''' + ''" не найден в базе "'' + DB_NAME() + ''"'';
            END
        END TRY
        BEGIN CATCH
            PRINT ''Ошибка при удалении пользователя из базы "'' + DB_NAME() + ''": '' + ERROR_MESSAGE();
        END CATCH
    ';
    EXEC sp_executesql @Sql;
    
    FETCH NEXT FROM db_cursor INTO @DBName;
END

CLOSE db_cursor;
DEALLOCATE db_cursor;

-- Теперь удаляем серверный логин, если он существует
IF EXISTS (SELECT 1 FROM sys.server_principals WHERE name = @LoginName AND type IN ('S', 'U', 'G'))
BEGIN
    SET @Sql = N'DROP LOGIN [' + @LoginName + N'];';
    EXEC sp_executesql @Sql;
    PRINT 'Логин "' + @LoginName + '" удалён с сервера.';
END
ELSE
BEGIN
    PRINT 'Логин "' + @LoginName + '" не существовал на сервере, но пользователи (если были) удалены из баз.';
END
▶ Вывод скрипта
строка 1
строка 2
строка 3