Полезные SQL скрипты для 1С: различия между версиями
Внешний вид
Новая страница: «* Создание учетки на sql-сервере и добавление в базы данных <pre> -- ============================================= -- Параметры (изменяйте только здесь) -- ============================================= DECLARE @LoginName NVARCHAR(128) = N'login_name'; DECLARE @Password NVARCHAR(128) = N'password'; DECLARE @Databases NVARCHAR(MAX) = N'base1,base2,base3,base4'; -- базы чере...» |
Нет описания правки |
||
| Строка 70: | Строка 70: | ||
PRINT 'Скрипт выполнен успешно.'; | PRINT 'Скрипт выполнен успешно.'; | ||
</pre> | |||
* Создание пользователя на sql-сервере (устаревшая версия): | |||
<pre> | |||
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 | |||
</pre> | </pre> | ||
Версия от 17:19, 14 мая 2026
- Создание учетки на 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