1

SQL Server 2005で実行されている、ユーザー定義のデータ型のDBがあります。ユーザー定義のデータ型もモデルデータベースに実装されているため、一時テーブルを作成するときに同じユーザー定義のデータ型を使用できます。

たとえば、AppDBでは次のデータ型を定義しています。

CREATE TYPE [dbo].[ product_code] FROM [varchar](8) NULL

そして、モデルでもまったく同じです。

CREATE TYPE [dbo].[ product_code] FROM [varchar](8) NULL

データベースインスタンスのセキュリティログインにsysadminサーバーの役割がある場合、ユーザーはproduct_codeデータ型を使用してtempdbにテーブルを作成するストアドプロシージャを問題なく呼び出すことができますが、アプリケーションのセキュリティログインからsysadminを削除すると、ストアドプロシージャの呼び出しは失敗します。

全体を通してユーザー定義のデータ型をvarcharシステムのデータ型に置き換えると、同じストアドプロシージャの呼び出しが成功します。

セキュリティ上の理由から、sysadminサーバーの役割をアプリケーションのセキュリティログインに追加したくありません。ユーザー定義のデータ型を引き続き使用する場合、どのようなオプションがありますか?これらのオプションはSQLServer2008で変更されますか?

具体的には、パブリックロールに付与されている権限以外にどのような権限が必要ですか?すべてのストアドプロシージャの編集が必要な回答は、応答しないと見なされます。

4

2 に答える 2

2

ユーザー定義のデータ型(別名エイリアス)とtempdbの問題は、最初に、ユーザー定義のデータ型をモデルデータベースで定義する必要があることです。これは、ここで正しく行われているとおりです。ただし、これらのオブジェクトを操作する権限を付与する必要があります。これを行うための合理的な方法は、モデルにdb_ddladminロールメンバーシップを付与することです。SQL Serverサービスを再起動すると、作成されたtempdbはdb_ddladminロールのメンバーシップを「継承」します。SQL Serverの再起動が望ましくない場合は、先に進んで、アプリケーションユーザー のtempdbに直接db_ddladminロールメンバーシップを付与します。

「MyAppUser」という名前のユーザーのモデルにプログラムでdb_ddladminロールを追加するには、次のようにします。

USE [model]
GO
EXEC sp_addrolemember N'db_ddladmin', N'MyAppUser'
GO

明確にするために、db_ddladmin固定ユーザーロールをアプリケーションdbに追加する必要はなく、モデルにのみ追加する必要があります。

于 2012-03-07T05:32:17.193 に答える
-1

tempdbにuddtを作成する必要はありません。一時テーブルのデータ型を一致させる場合は、次を使用します。

select fieldx, fieldy into #temptable from sourcetable

または使用:

declare @fieldx product_code

select @fieldx into #temptable

そうすれば、フィールドサイズが一致し、権限の問題は発生しません。

tempdbに永続テーブルを作成したい場合...私のアドバイスは、これらのテーブル用の特定のデータベースを作成することです。

于 2012-03-04T22:17:17.437 に答える