私はSQLServerの初心者です。私はしばらくの間ウェブ上で探し回ろうとしましたが、私の質問に答えることができませんでした。誰かがSQLServer2008データベースに保存されているビューが正確にどこにあるか教えてもらえますか?
5 に答える
あなたの質問に対する衒学的な答えは...ビューのメタデータが物理的にどこに保存されているかを正確に知っているのはMicrosoftだけです。SQL 2000 から SQL 2005 (2008 のベース) への移行で、MS は、ビューが文字どおり格納されていたシステム テーブル (dbo.sysviews および dbo.syscomments) への直接アクセスを取り除き、抽象化のレイヤーを追加しました (これは、カタログ ビューを介してのみビューに関するメタ データにアクセスできることを意味します。INFORMATION_SCHEMA は、ANSI 準拠の一連のカタログ ビューです。バージョン間の相対的な移植性にはわずかに役立ちますが、多くの場合、SQL 2008 カタログ ビュー (この場合はsys.viewsおよびsys.sql_modules ) からより多くの情報を入手できます。
ビューの SQL 定義を含む sys.comments レコードを暗号化する ENCRYPTION オプション セットを使用してビューを作成できることに注意してください。ただし、暗号化されていない場合は、sp_helptext [MyView] で定義を簡単に確認できます。
以下の最初のコメントに従って編集し、「sys.comments」を「sys.sql_modules」に置き換えます
注:この投稿
http://improve.dk/archive/2012/08/27/where-does-sql-server-store-the-source-for-stored-procedures.aspxに基づいて、定義がのビューは、sys.sysobjvalues
システム テーブルにも (また) 格納されます。
T-SQL
すべてのユーザーモジュール (SQL Server 2008 内)のリストは、sys.sql_modules
システム ビュー (リンク) を使用して照会できます。ここでは、ユーザー ビューの定義を確認できます (列 definition
)。
SELECT QUOTENAME(s.name)+'.'+QUOTENAME(o.name) AS full_object_name,
m.*
FROM sys.sql_modules m
JOIN sys.objects o ON m.object_id=o.object_id
JOIN sys.schemas s ON o.schema_id=s.schema_id
WHERE o.type='V' -- only view objects
ORDER BY full_object_name
実行EXEC sp_helptext 'sys.sql_modules'
すると、このシステム ビューのソース コードが得られます。
CREATE VIEW sys.sql_modules AS
SELECT object_id = o.id,
definition = object_definition(o.id),
uses_ansi_nulls = sysconv(bit, o.status & 0x40000), -- OBJMOD_ANSINULLS
uses_quoted_identifier = sysconv(bit, o.status & 0x80000), -- OBJMOD_QUOTEDIDENT
is_schema_bound = sysconv(bit, o.status & 0x20000), -- OBJMOD_SCHEMABOUND
uses_database_collation = sysconv(bit, o.status & 0x100000), -- OBJMOD_USESDBCOLL
is_recompiled = sysconv(bit, o.status & 0x400000), -- OBJMOD_NOCACHE
null_on_null_input = sysconv(bit, o.status & 0x200000), -- OBJMOD_NULLONNULL
execute_as_principal_id = x.indepid
FROM sys.sysschobjs o
LEFT JOIN sys.syssingleobjrefs x ON x.depid = o.id AND x.class = 22 AND x.depsubid = 0 -- SRC_OBJEXECASOWNER
WHERE o.pclass <> 100
AND ((o.type = 'TR' AND has_access('TR', o.id, o.pid, o.nsclass) = 1)
OR (type IN ('P','V','FN','IF','TF','RF','IS') AND has_access('CO', o.id) = 1)
OR (type IN ('R','D') AND o.pid = 0))
このビューsys.sysschobjs
は、ビューの定義を格納するために使用されるシステム テーブルであると思われる別のシステム オブジェクトを照会していることがわかります。
注1:ビューの定義を見つけるために使用することは、列の定義が(最大4000文字)でINFORMATION_SCHEMA.VIEWS
あるため、信頼できる方法ではありません。INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
convert(nvarchar(4000), object_definition(object_id))
注 2: 代わりに、sys.sql_modules.definition
column:を使用する必要がありますdefinition = object_definition(o.id)
。object_definition
関数 (リンク) を見ると、戻り値の型が であることがわかりますnvarchar(max)
。
システムテーブル内。
次のクエリはそれらを取得します...
SELECT TABLE_NAME as ViewName、VIEW_DEFINITION as ViewDefinition FROM INFORMATION_SCHEMA.Views
それらを通常表示編集するには、スタジオマネージャーのテーブルの下にあるビューフォルダーを確認します。
デザイナを使用してこのフォルダから作成/編集するか、スクリプトを作成できます。
ビューが生成するテーブルを意味する場合、答えはそれらがまったく保存されていないということです。ビューは単なるクエリであり、保存されるのはそれだけです。ビューをクエリすると、dbエンジンはビュークエリの結果を取得してからそれらをクエリします。
DBエンジンは「マテリアライズド」ビューを格納できますが、それは別のトピックです。
ビューは、データベース スキーマ (INFORMATION_SCHEMA.Views) に格納される単純な SQL ステートメントです。したがって、ビューを呼び出すたびに、SQL ステートメントが実行され、メインの物理テーブルから行が返されます。
定義 (SQL ステートメント) を格納するが結果を格納しない論理テーブルとしてビューを指定することもできます。
上記のダンが言ったように、以下のステートメントを使用して定義を確認できます。ビュー定義が暗号化されていない場合のみ: SELECT TABLE_NAME as ViewName, VIEW_DEFINITION as ViewDefinition FROM INFORMATION_SCHEMA.Views
詳細については、View @ MSDNを参照してください。