web-dev-qa-db-ja.com

SQL Server TRUNCATE TABLE権限

SQL ServerユーザーがDDLステートメントにアクセスできないがTRUNCATE TABLEコマンドを実行できるように構成することは可能ですか?私は舞台裏でそれがDDLであることを知っています。

検索エンジンでこれを見つけることができませんでした。

3

ユーザーにALTERを付与せずにTRUNCATEを付与することはできません。

ただし、ユーザーにDELETEを付与することで回避できます。

2

Jonathan Kehayiasによる この手法 を使用して、ユーザーがテーブルをTRUNCATEできるストアドプロシージャを作成できます。

ヨハサンが言うように:

「何らかの理由でその権限が存在しないため、切り捨てを許可することはできません。ストアドプロシージャを使用し、EXECUTE AS OWNERを使用して回避できます。」

上記の投稿のサンプルコードを以下に示します。

CREATE DATABASE foo
GO

CREATE LOGIN foobar
    WITH password = 'Pa$$w0rd';
GO

USE foo
GO

CREATE user foobar
FROM LOGIN foobar;
GO

CREATE TABLE test (rowid INT identity)
GO

INSERT INTO test DEFAULT
VALUES;
GO

SELECT *
FROM test
GO

CREATE PROCEDURE dbo.truncate_test
    WITH EXECUTE AS OWNER
AS
TRUNCATE TABLE test
GO

GRANT EXECUTE
    ON dbo.truncate_test
    TO foobar
GO

EXECUTE AS LOGIN = 'foobar'

EXECUTE dbo.truncate_test

REVERT
GO

SELECT *
FROM test
GO

USE master
GO

DROP DATABASE foo

DROP LOGIN foobar
6
Scott Hodgin

最後に、これは最も詳細で安全なオプションであるため、これを実現するには モジュール署名 を使用することをお勧めします。これは、なりすましオプション @ Scottで推奨 に似ていますが、ストアドプロシージャで必要な機能をラップしますが、セキュリティを変更しないため、EXECUTE ASを使用するよりも問題が少なくなります。誰かがストアドプロシージャの1バイトを変更すると、昇格されたアクセス許可が削除され、変更を確認して、変更に同意した場合にのみアクセス許可を再適用する必要があります。

次のようにしてください:

  1. TRUNCATE TABLEおよびその他の必要な処理をすべて行うストアドプロシージャを作成します。

  2. 問題のDBで証明書を作成します(私の好みは、保護のためにデータベースマスターキー(DMK)に依存するのではなく、パスワードを指定することです)。

    CREATE CERTIFICATE [TruncatePermission]
    ENCRYPTION BY PASSWORD = 'password-123'
    WITH SUBJECT = 'Grant temporary db_owner status';
    
  3. ADD SIGNATUREを使用して、証明書でストアドプロシージャに署名します。

    ADD SIGNATURE
      TO dbo.[{new_Stored_Procedure_name}]
      BY CERTIFICATE [TruncatePermission]
      WITH PASSWORD = 'password-123';
    
  4. 証明書を次の場所にバックアップします。

    • ファイル(a。cer公開鍵(「証明書」)、および。pvk秘密鍵のファイル):

      BACKUP CERTIFICATE [TruncatePermission]
      TO FILE = 'path_to_public_key_(.cer)_file'  
      WITH PRIVATE KEY
      (
          FILE = 'path_to_private_key_(.pvk)_file',
          ENCRYPTION BY PASSWORD = 'password-123',
          DECRYPTION BY PASSWORD = 'password-123'
      );
      

    [〜#〜]または[〜#〜]

    • 組み込み関数を使用するVARBINARYリテラル:

      SELECT
        CERTENCODED(CERT_ID(N'TruncatePermission')) AS [Cert/PublicKey],
        CERTPRIVATEKEY(CERT_ID(N'TruncatePermission'),
                       'password-123', 'password-123') AS [PrivateKey];
      
  5. ALTER CERTIFICATEを使用して証明書の秘密鍵を削除し、他のものが証明書で署名されないようにします(ただし、パスワードも必要になるため、リスクは高くありません)。

    ALTER CERTIFICATE [TruncatePermission]
        REMOVE PRIVATE KEY;
    
  6. その証明書からユーザーを作成します。

    CREATE USER [Mr.Truncate] FROM CERTIFICATE [TruncatePermission];
    
  7. そのユーザーに、目標を達成するために必要な権限を付与します。機能する最小限の特権/最も制限の厳しいアクセス許可を見つけようとしますが、この場合、(db_owner固定データベースロールを介して)「dbo」が必要になる可能性があります。

    ALTER ROLE [db_owner] ADD MEMBER [Mr.Truncate];
    
  8. ストアドプロシージャのEXECUTEを、この操作を実行できるユーザーまたはロール、あるいはその両方の組み合わせに付与します。

証明書ベースのユーザーに付与されるアクセス許可は少し多めですしかしユーザーは偽装できず(つまり、EXECUTE AS USER = N'Mr.Truncate';)、ログインできません。そのユーザーは、追加のアクセス許可の単なるコンテナーであり、それらは、その証明書で署名されたものにのみ適用されます。この場合、これは1つのストアドプロシージャにすぎません。

ストアドプロシージャ内のコードを変更する必要がある場合、またはADD SIGNATUREで署名して別のモジュールにそれらの権限を付与する必要がある場合は、署名する新しいコードが存在する場合、別のDBに同じ証明書を作成する必要があります。別のDB、またはALTER CERTIFICATEステートメントを使用して、秘密鍵をこの証明書に復元する必要があります。

2
Solomon Rutzky

テーブルを変更する権限が必要です。

あなたはそれをここで見つけることができます: https://technet.Microsoft.com/en-us/library/ms177570(v = sql.105).aspx

下:権限。

0
user_0