Клонирование базы данных
От: Caracrist https://1pwd.org/
Дата: 27.05.10 12:58
Оценка:
Есть необходимость с помощью TSQL создать базу данных на основе уже существующей. А в частности скопировать все настройки доступа, что операции доступние на оригинальной базе определенному пользователу(группе) были бы доступны и на новой.

Помогите разобраться, что конкретно и как мне нужно скопировать с оригинальной базы данных...

MSSQL 2005+
~~~~~
~lol~~
~~~ Single Password Solution
Re: Клонирование базы данных
От: capgreen  
Дата: 27.05.10 13:36
Оценка:
Здравствуйте, Caracrist.

Вам поможет Backup/Restore.
Re[2]: Клонирование базы данных
От: Caracrist https://1pwd.org/
Дата: 27.05.10 13:41
Оценка:
Здравствуйте, capgreen, Вы писали:

C>Здравствуйте, Caracrist.


C>Вам поможет Backup/Restore.


А как можно сделать Backup и Restore только настройкам базы данных (структура таблиц, зависимости и данные мне не нужно) при условии что мне не исвестно ни чего о файловой системе и при этом не оставить после себя мусор?
~~~~~
~lol~~
~~~ Single Password Solution
Re: Клонирование базы данных
От: wildwind Россия  
Дата: 27.05.10 19:16
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>что операции доступние на оригинальной базе определенному пользователу(группе) были бы доступны и на новой.


C>структура таблиц ... не нужно


Противоречие однако.
Re: Клонирование базы данных
От: _ABC_  
Дата: 28.05.10 07:31
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Есть необходимость с помощью TSQL создать базу данных на основе уже существующей. А в частности скопировать все настройки доступа, что операции доступние на оригинальной базе определенному пользователу(группе) были бы доступны и на новой.


C>Помогите разобраться, что конкретно и как мне нужно скопировать с оригинальной базы данных...


C>MSSQL 2005+


Операция одноразовая? Generate Scripts я так понимаю не подходит?
Re[2]: Клонирование базы данных
От: Caracrist https://1pwd.org/
Дата: 28.05.10 11:55
Оценка:
Здравствуйте, _ABC_, Вы писали:


_AB>Операция одноразовая? Generate Scripts я так понимаю не подходит?


Операция многоразовая, нужно будет создавать базу, использовать, и потом удалять. (не сильно интенсивно, однако)
Сама база не дана, мой TSQL получит имя базы и должен будет всё сделать сам.

Generate Scripts это ручная работа, там у меня не будет такого рода доступа. Только sa и имя базы по образу которой нужно настроить доступы.
~~~~~
~lol~~
~~~ Single Password Solution
Re: Клонирование базы данных
От: kvasya  
Дата: 28.05.10 16:52
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Есть необходимость с помощью TSQL создать базу данных на основе уже существующей. А в частности скопировать все настройки доступа, что операции доступние на оригинальной базе определенному пользователу(группе) были бы доступны и на новой.


C>Помогите разобраться, что конкретно и как мне нужно скопировать с оригинальной базы данных...


C>MSSQL 2005+


См. системные таблицы master и msdb баз. Подробности выдергивай из bol. Например логины — в master, там же и роли и т.д.
Что нужно — скриптуй. Не сложный процесс.
Re: Клонирование базы данных
От: Caracrist https://1pwd.org/
Дата: 31.05.10 07:53
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Есть необходимость с помощью TSQL создать базу данных на основе уже существующей. А в частности скопировать все настройки доступа, что операции доступние на оригинальной базе определенному пользователу(группе) были бы доступны и на новой.


C>Помогите разобраться, что конкретно и как мне нужно скопировать с оригинальной базы данных...


C>MSSQL 2005+


вот код копирования:
(Если кому интересно, под катом)
  Скрытый текст
Copy roles:
USE [database source name]
GO

DECLARE @role_name sysname,
        @owner_name sysname    
        
DECLARE Roles_Cursor CURSOR FOR
SELECT roles.name, owners.name FROM sys.database_principals roles
    INNER JOIN sys.database_principals owners
    ON roles.owning_principal_id = owners.principal_id
    WHERE roles.type in (N'R') 

OPEN Roles_Cursor

FETCH NEXT FROM Roles_Cursor
INTO @role_name, @owner_name
WHILE @@FETCH_STATUS = 0
BEGIN
    IF NOT EXISTS (SELECT name FROM [database target name].sys.database_principals 
        WHERE name = @role_name)
    BEGIN
        DECLARE @sql nvarchar(1024)
        SET @sql = N'
        USE [database target name]
        CREATE ROLE ['+ @role_name+N'] AUTHORIZATION ['+@owner_name + N']'
        EXEC (@sql)
    END
    FETCH NEXT FROM Roles_Cursor
    INTO @role_name, @owner_name
END
CLOSE Roles_Cursor;
DEALLOCATE Roles_Cursor;
GO


Copy users:
USE [database source name]
GO

DECLARE @user_name sysname,
        @schema_name sysname    
        
DECLARE Users_Cursor CURSOR FOR
SELECT name, default_schema_name FROM sys.database_principals
    WHERE type in (N'S', N'U')

OPEN Users_Cursor

FETCH NEXT FROM Users_Cursor
INTO @user_name, @schema_name
WHILE @@FETCH_STATUS = 0
BEGIN
    IF NOT EXISTS (SELECT name FROM [database target name].sys.database_principals 
        WHERE name = @user_name)
    BEGIN
        DECLARE @sql nvarchar(1024)
        SET @sql = N'
        USE [database target name]
        CREATE USER ['+ @user_name+N'] FOR LOGIN ['+@user_name + N']'
        IF NOT (@schema_name IS NULL)
            SET @sql = @sql + N'WITH DEFAULT_SCHEMA=[' + @schema_name + N']'
        EXEC (@sql)
    END
    FETCH NEXT FROM Users_Cursor
    INTO @user_name, @schema_name    
END
CLOSE Users_Cursor;
DEALLOCATE Users_Cursor;
GO



Copy principals
USE [database source name]
GO
    
DECLARE @role_name sysname,
        @member_name sysname    

DECLARE RoleMember_Cursor CURSOR FOR

SELECT role_principals.name, member_principals.name FROM sys.database_role_members role_members
INNER JOIN sys.database_principals role_principals
ON role_members.role_principal_id = role_principals.principal_id 
INNER JOIN sys.database_principals member_principals
ON role_members.member_principal_id = member_principals.principal_id

OPEN RoleMember_Cursor;

FETCH NEXT FROM RoleMember_Cursor
INTO @role_name, @member_name
WHILE @@FETCH_STATUS = 0
BEGIN
    IF NOT EXISTS ( 
        SELECT role_principals.name, member_principals.name FROM [database target name].sys.database_role_members role_members
            INNER JOIN [database target name].sys.database_principals role_principals
            ON role_members.role_principal_id = role_principals.principal_id 
            INNER JOIN [database target name].sys.database_principals member_principals
            ON role_members.member_principal_id = member_principals.principal_id
            WHERE 
                role_principals.name = @role_name AND
                member_principals.name = @member_name)
    BEGIN        
        EXEC [database target name].sys.sp_addrolemember @role_name, @member_name
    END
    FETCH NEXT FROM RoleMember_Cursor
    INTO @role_name, @member_name
END

CLOSE RoleMember_Cursor;
DEALLOCATE RoleMember_Cursor;
GO


Copy permissions
USE [database source name]
GO
    
DECLARE @grantee_name sysname,
        @grantor_name sysname,
        @permission_name sysname,
        @grant_state nvarchar

DECLARE Permissions_Cursor CURSOR FOR

SELECT grantee_principals.name, grantor_principals.name, permission.permission_name, permission.state FROM sys.database_permissions permission
INNER JOIN sys.database_principals grantee_principals
ON permission.grantee_principal_id = grantee_principals.principal_id 
INNER JOIN sys.database_principals grantor_principals
ON permission.grantor_principal_id = grantor_principals.principal_id
WHERE permission.state in (N'G', N'W')

OPEN Permissions_Cursor;

FETCH NEXT FROM Permissions_Cursor
INTO @grantee_name, @grantor_name, @permission_name, @grant_state
WHILE @@FETCH_STATUS = 0
BEGIN
    IF NOT EXISTS ( 
            SELECT grantee_principals.name, grantor_principals.name, permission.permission_name, permission.state FROM [database target name].sys.database_permissions permission
            INNER JOIN [database target name].sys.database_principals grantee_principals
            ON permission.grantee_principal_id = grantee_principals.principal_id 
            INNER JOIN [database target name].sys.database_principals grantor_principals
            ON permission.grantor_principal_id = grantor_principals.principal_id
            WHERE permission.state in (N'G', N'W')
            AND 
                grantee_principals.name = @grantee_name AND
                permission.permission_name = @permission_name)
    BEGIN    
        DECLARE @sql nvarchar(1024),
                @grant nvarchar(32)
                
        IF (@grant_state in (N'W'))
            SET @grant = N'WITH GRANT OPTION'
        ELSE
            SET @grant = N''
            
        SET @sql = N'
                USE [database target name]
                BEGIN TRY
                GRANT '+@permission_name+N' TO ['+@grantee_name+N'] '+@grant+N' AS ['+@grantor_name+N']
                END TRY
                BEGIN CATCH
                GRANT '+@permission_name+N' TO ['+@grantee_name+N'] '+@grant+N'
                END CATCH'
        EXEC (@sql)
    END
    FETCH NEXT FROM Permissions_Cursor
    INTO @grantee_name, @grantor_name, @permission_name, @grant_state
END

CLOSE Permissions_Cursor;
DEALLOCATE Permissions_Cursor;
GO


Надеюсь я ни чего не забыл...
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.