Полезные SQL скрипты для 1С
Внешний вид
- Создание учетки на 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
</pre>
* Удаление пользователя с SQL-сервера и из всех баз:
<pre>
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