0

非本番サーバーでは、本番サーバーから定期的に情報が更新されます。これを行う方法は、本番環境の完全バックアップを実行してから、それを非本番SQLServerに復元することです。これには、ユーザーのすべての権限を上書きするという望ましくない影響があります。

私は、スクリプトの形式でデータベースからこれらのアクセス許可を引き出す方法を見つけようとしてきました。そうすれば、データベースが更新されたときに、新しく更新されたデータベースに対してスクリプトを実行して、アクセス許可を復元できます。

sys.database_principalsとsys.database_permissionsでデータを見つけようとしましたが、SQL-fuではこのデータを使用できるようにするのに十分ではありません。

このデータを取得するための最良の方法は何ですか?

4

2 に答える 2

1

K. Brian Kelleyは、SQLServerCentralでこのための非常に優れたスクリプトを持っています。

このページの右側にある「関連」リンクのいくつかを試すこともできます。

于 2012-12-13T22:51:52.107 に答える
0

これは、同様に静かに動作するが、列レベルのアクセス許可をサポートする別の1つです。出力は機能しますが、より複雑なデータベースでは改善する必要があります。だから、あなたにアイデアを与えるためだけに:

SELECT 'GRANT ' + database_permissions.permission_name + ' ON ' +
    CASE database_permissions.class_desc
        WHEN 'SCHEMA' THEN schema_name(major_id)
        WHEN 'OBJECT_OR_COLUMN' THEN
            CASE WHEN minor_id = 0 THEN object_name(major_id) COLLATE Latin1_General_CI_AS_KS_WS
            ELSE (SELECT object_name(object_id) + ' ('+ name + ')'
                  FROM sys.columns 
                  WHERE object_id = database_permissions.major_id 
                  AND column_id = database_permissions.minor_id) end
        ELSE 'other' 
    END + 
    ' TO ' + database_principals.name COLLATE Latin1_General_CI_AS_KS_WS
FROM sys.database_permissions
JOIN sys.database_principals
ON database_permissions.grantee_principal_id = database_principals.principal_id
LEFT JOIN sys.objects -- consider schemas
ON objects.object_id = database_permissions.major_id
WHERE database_permissions.major_id > 0
AND permission_name in ('SELECT','INSERT','UPDATE','DELETE')
于 2014-05-19T21:01:11.027 に答える