質問:SQL Server 2005では、アセンブリxy(MyFirstUdpなど)を使用するすべてのSQL CLR関数/プロシージャをどのようにリストできますか?
たとえば、クエリパラメータMyFirstUdpのHelloWorldをリストする関数
CREATE PROCEDURE HelloWorld
AS EXTERNAL NAME MyFirstUdp.[SQL_CLRdll.MySQLclass].HelloWorld
GO
私が走った後
CREATE Assembly MyFirstUdp FROM 'C:\Users\username\Documents\Visual Studio 2005\Projects\SQL_CLRdll\SQL_CLRdll\bin\Debug\SQL_CLRdll.dll
すべてのアセンブリとすべての関数/プロシージャを一覧表示できますが、アセンブリを関数/プロシージャに関連付けることができないようです...
sys.Assembly_modules
見る:
select * from sys.Assembly_modules
これにより、すべての関数とそれらが定義されているアセンブリがリストされます。詳細については ブックのオンラインヘルプページ を参照してください。
共通言語ランタイム(CLR)アセンブリによって定義されている関数、プロシージャ、またはトリガーごとに1行を返します。
次のSQLを使用します。
SELECT so.name AS [ObjectName],
so.[type],
SCHEMA_NAME(so.[schema_id]) AS [SchemaName],
asmbly.name AS [AssemblyName],
asmbly.permission_set_desc,
am.Assembly_class,
am.Assembly_method
FROM sys.Assembly_modules am
INNER JOIN sys.assemblies asmbly
ON asmbly.Assembly_id = am.Assembly_id
AND asmbly.is_user_defined = 1 -- if using SQL Server 2008 or newer
-- AND asmbly.name NOT LIKE 'Microsoft%' -- if using SQL Server 2005
INNER JOIN sys.objects so
ON so.[object_id] = am.[object_id]
UNION ALL
SELECT at.name AS [ObjectName],
'UDT' AS [type],
SCHEMA_NAME(at.[schema_id]) AS [SchemaName],
asmbly.name AS [AssemblyName],
asmbly.permission_set_desc,
at.Assembly_class,
NULL AS [Assembly_method]
FROM sys.Assembly_types at
INNER JOIN sys.assemblies asmbly
ON asmbly.Assembly_id = at.Assembly_id
AND asmbly.is_user_defined = 1 -- if using SQL Server 2008 or newer
-- AND asmbly.name NOT LIKE 'Microsoft%' -- if using SQL Server 2005
ORDER BY [AssemblyName], [type], [ObjectName]
ご注意ください:
ユーザー定義型(UDT)は、sys.Assembly_typesにあります。
リストできるのは、CREATEステートメントで使用されたCLR参照のみです。まだCREATEによって参照されていないCLRメソッドを見つけることができません。つまり、「このアセンブリでSQLオブジェクトを作成できるメソッドのリストを教えてください」とは言えません。
ここでは、 sqlhint.com にあるスクリプト:
SELECT
SCHEMA_NAME(O.schema_id) AS [Schema], O.name,
A.name AS Assembly_name, AM.Assembly_class,
AM.Assembly_method,
A.permission_set_desc,
O.[type_desc]
FROM
sys.Assembly_modules AM
INNER JOIN sys.assemblies A ON A.Assembly_id = AM.Assembly_id
INNER JOIN sys.objects O ON O.object_id = AM.object_id
ORDER BY
A.name, AM.Assembly_class
以下は、カーソルを使用してサーバー上のすべてのDBを通過するsrutzkyのクエリ(上記)の一般化です。フォーマットについては申し訳ありませんが、継承した500のDBを検索する必要がある場合に便利です。
set nocount on
declare @cmd nvarchar(4000)
declare curDBs cursor read_only for
SELECT name FROM MASTER.sys.sysdatabases
declare @NameDB nvarchar(100)
create table #tmpResults (
DatabaseName nvarchar(128)
, ObjectName nvarchar(128)
, ObjectType char(2)
, SchemaName nvarchar(128)
, AssemblyName nvarchar(128)
, PermissionSet nvarchar(60)
, AssemblyClass nvarchar(128)
, AssemblyMethod nvarchar(128));
open curDBs; while (1=1)
begin
fetch next from curDBs into @NameDB
if @@fetch_status <> 0 break
set @cmd = N'
USE [' + @NameDB + N'];
begin try
insert into #tmpResults
SELECT ''' + @NameDB + N''',
so.name AS [ObjectName],
so.[type],
SCHEMA_NAME(so.[schema_id]) AS [SchemaName],
asy.name AS [AssemblyName],
asy.permission_set_desc,
am.Assembly_class,
am.Assembly_method
FROM sys.Assembly_modules am
INNER JOIN sys.assemblies asy
ON asy.Assembly_id = am.Assembly_id
AND asy.is_user_defined = 1
INNER JOIN sys.objects so
ON so.[object_id] = am.[object_id]
UNION ALL
SELECT ''' + @NameDB + N''',
at.name AS [ObjectName],
''UDT'' AS [type],
SCHEMA_NAME(at.[schema_id]) AS [SchemaName],
asy.name AS [AssemblyName],
asy.permission_set_desc,
at.Assembly_class,
NULL AS [Assembly_method]
FROM sys.Assembly_types at
INNER JOIN sys.assemblies asy
ON asy.Assembly_id = at.Assembly_id
AND asy.is_user_defined = 1
ORDER BY [AssemblyName], [type], [ObjectName]
print ''' + @NameDB + N' ' + cast(@@rowcount as nvarchar) + N'''
end try
begin catch
print ''Error processing ' + @NameDB + '''
end catch
'
--print @cmd
EXEC sp_executesql @cmd
end
close curDBs; deallocate curDBs
select * from #tmpResults
drop table #tmpResults
または、SELECT * FROM sys.dm_clr_appdomainsを使用できます。アセンブリのリストとそれらが格納されているデータベースを返します。
T
SELECT
modules.Assembly_class AS AssemblyClass,
modules.Assembly_method AS MethodName,
obj.type_desc AS MethodType,
files.name AS FilePath,
assemb.name AS AssemblyName,
assemb.clr_name,
assemb.create_date,
assemb.modify_date,
assemb.permission_set_desc
--,*
FROM
sys.Assembly_modules AS modules
JOIN sys.Assembly_files AS files ON files.Assembly_id = modules.Assembly_id
JOIN sys.assemblies AS assemb ON assemb.Assembly_id = modules.Assembly_id
JOIN sys.objects AS obj ON obj.object_id = modules.object_id