sql >> データベース >  >> RDS >> Sqlserver

メッセージ 4834 バルク ロード ステートメントを使用する権限がありません

    コメントで述べたように、なりすましを使用すると、サーバー レベルのアクセス許可が剥奪されます。

    これには 2 つの方法があります:

    悪い手っ取り早い方法:

    データベースの推力を ON に設定します。それは仕事を成し遂げるでしょう。しかし、これが何をするのかを完全に理解していない場合は、これを行わないことをお勧めします。

    ただし、コードは次のとおりです:

    ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;
      

    良いが遅い方法

    これははるかに正確であり、厄介なセキュリティの副作用はありません.

    あなたがすることは、証明書を使用してストアド プロシージャに署名することです。データベース内のその証明書からユーザーを作成します。そのユーザーに、データベース内のテーブルに対する適切な権限を付与します。また、同じ証明書からログインを作成し、そのログインに一括権限を付与します。

    その証明書でストアド プロシージャに署名するため、sp が実行されるたびに、そのユーザーのコンテキストで実行され、その証明書から作成された場所にログインします。

    手順は次のとおりです:

    <オール> <リ>

    マスターに証明書を作成

    <リ>

    その証明書からログインを作成します

    <リ>

    そのログインに一括管理権限を付与します

    ここで、ユーザー データベースにまったく同じ証明書が必要になるため、いくつか追加の手順を実行する必要があります

    <オール> <リ>

    証明書をディスクにエクスポート

    <リ>

    証明書をユーザー データベースにインポートします

    これで最終決定できます

    <オール>
  1. 証明書からユーザーを作成
  2. テーブルに対する権限をそのユーザーに付与する
  3. ストアド プロシージャから execute as 句を削除
  4. 証明書を使用してストアド プロシージャに署名する
  5. コードは次のとおりです:

    USE master
    go
    CREATE CERTIFICATE BulkInsertCert
       ENCRYPTION BY PASSWORD = 'NicePassword!0'
       WITH SUBJECT = 'Gives Bulk Insert Privilegde'
    go
    
    CREATE LOGIN BulkInsert_CertLogin FROM CERTIFICATE BulkInsertCert
    go
    
    
    GRANT ADMINISTER BULK OPERATIONS TO BulkInsert_CertLogin
    go
    
    
    BACKUP CERTIFICATE BulkInsertCert TO FILE = '[your directory]\BulkInsertCert.cer'
    WITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk' ,
                      ENCRYPTION BY PASSWORD = 'EvenNicerPassword!0',
                      DECRYPTION BY PASSWORD = 'NicePassword!0')
    go
    
    USE [YourDatabase]
    CREATE CERTIFICATE BulkInsertCert FROM FILE = '[your directory]\BulkInsertCert.cer'
    WITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk',
                      DECRYPTION BY PASSWORD = 'EvenNicerPassword!0',
                      ENCRYPTION BY PASSWORD = 'TheVeryBestPasswordThereIs!0')
    go
    --NOW DELETE THE CERTIFICATES FROM DISK
    
    CREATE USER BulkInsert_CertUser FOR CERTIFICATE BulkInsertCert
    go
    GRANT ALTER, INSERT ON [YourTable] TO BulkInsert_CertUser
    go
    
    
    ALTER PROCEDURE usp_myproc
    AS
    EXEC('INSERT INTO ' + @tablename + '
                SELECT col1, col2, col3
                FROM OPENROWSET( 
                  BULK '''+ @filepath +''',
                  FORMATFILE='''+ @formatfile +''',
                  FIRSTROW=2
                )as t'
              )
    -- Sign the test procedure each time you have changed it.
    ADD SIGNATURE TO usp_myproc BY CERTIFICATE BulkInsertCert
        WITH PASSWORD = 'TheVeryBestPasswordThereIs!0'
    go
      

    最後の注意:

    Your directory を、SQL サービス アカウントに書き込み権限があることが確実なパスに置き換えてください!

    設定が完了したら、これらのエクスポートされた証明書を必ず削除してください..



    1. 文字列値が正しくありません:'\ xE2 \ x80 \ xAF(fo ...' for column'description' at row 1 Error:INSERT INTO my_table_name

    2. 低RTOでのディザスタリカバリのための複数の遅延レプリケーションスレーブ

    3. MySQLC++コネクタの未解決の外部シンボル_get_driver_instance

    4. MySQL pidが終了しました(mysqlを起動できません)