2017-11-30 15 views
0

新しく作成されたテーブルにアクセス許可(つまり、GRANT)をプログラムで設定します。私はSQL Serverにデータベースの別のテーブルに行き、右クリックして "Script Table as"を実行することでそのスクリプトを表示することを望んでいましたが、その下にあるGRANTのオプションは表示されません。テーブルにアクセス許可をプログラムで設定する

SQL Serverにこのスクリプトを表示させることはできますか?

+0

「grant select on SomeTable to SomeUser'」のようなものですか?または、表の 'GRANT ALL'は' DELETE、INSERT、REFERENCES、SELECT、UPDATE'となります – scsimon

+0

特定の権限を持つ特定のユーザー。 –

+0

* real *の問題は、パーミッションを設定していません - 特定のテーブルに対して*既存のパーミッションをフェッチしています*。そうですか? –

答えて

1

さらにご覧ください。単純なバージョンでは、権限を設定するダイアログを使用します。例えば、

enter image description here

より一般的で先進的なアプローチ - はるかに多くのオプションを持つ - は、データベース・レベルでスクリプト機能を使用することです。データベース上で、をクリックして選択し、ウィザードを実行して、テーブルと必要なスクリプティングオプションを選択します。スクリプティングオプションタブの[詳細]ボタンをクリックしてください。このタブでは、「オブジェクトレベルの権限」(デフォルトではオフ)が表示されます。

+0

ありがとう、これは適切な場所のようです。しかし、_Script_をプルダウンして_Script Action to New Query Window_を選択すると、「スクリプトを作成するアクションがありません」というメッセージが表示されます。これは、_Script_の下のいずれの選択に対しても起こります。 *権限が選択されており、権限が選択されています(この場合は、権限付与:削除、許可:挿入、付与:選択と付与:更新) –

+0

あなたは何も変更しませんでした。最初の提案は、権限の変更を行い、**その特定の時点で**行われた変更に対して実行される実際のtsqlスクリプトを表示したい場合に適用されます** – SMor

+0

OIC、それらのボックスのチェックを外し、スクリプトを再度確認して確認することができます。 –

1

コメントするには長すぎます。この場合

GRANT <n> ON YourDatabase.YourSchema.YourTable TO YourSpecificUser 

それはテーブルのため、<n>は、次のいずれか:

  • DELETE
  • INSERT
  • REFERENCES
  • SELECT
  • UPDATE

ユーザーにfixed database roleがある場合、明示的に許可するよりも多くのアクセス権を持つ可能性があります。 GRANT Object Permissionsについてもっと読む。テーブルの上の権限のリストを返すために注目すべき

、あなたは、これらの結果をキャプチャして、動的なSQLクエリを構築するためにそれらをループすることができますsp_table_privileges

sp_table_privileges @table_name = 'YourTable' 

を使用することができます。

以下のスクリプトをTableNameと置き換えてください。NewTableNameは何ですか。印刷に満足したら、exec(@sql)のコメントを外して、印刷されたコードを実行することができます。

if object_id('tempdb..#priv') is not null 
drop table #priv 

create table #priv(ID int identity (1,1) 
        ,TABLE_QUALIFIER varchar(64) 
        ,TABLE_OWNER VARCHAR(64) 
        ,TABLE_NAME VARCHAR(64) 
        ,GRANTOR VARCHAR(64) 
        ,GRANTEE VARCHAR(64) 
        ,PRIVILEGE VARCHAR(64) 
        ,IS_GRANTABLE VARCHAR(8)) 

insert into #priv 
exec sp_table_privileges @table_name = 'YourTableName' 

declare @i int = 1 
declare @max int = (select max(id) from #priv) 
declare @sql varchar(max) = '' 

while (@i <= @max) 
begin 
    set @sql = @sql + (select ' GRANT ' + stuff(PRIVILEGE,1,0,' ') + ' ON ' + stuff(TABLE_NAME,1,0,' ') + ' TO ' + stuff(GRANTEE,1,0,' ') + char(13) + ' GO ' + char(13) from #priv where ID = @i) 
    set @i = @i + 1 
end 

print(@sql) 
set @sql = replace(@sql,'YourTableName','NewTableName') 
print(@sql) 
--exec(@sql) 
+0

ありがとうございますが、これは質問に答えません。 –

+0

だから、カーソルと動的SQLと一緒にプロシージャの結果を使用したいと思う – scsimon

+0

編集を参照してください@AlLelopath – scsimon

関連する問題