web-dev-qa-db-ja.com

SQL Server:すべてのCLR関数/プロシージャ/オブジェクトをアセンブリ用にリストする方法

質問: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

すべてのアセンブリとすべての関数/プロシージャを一覧表示できますが、アセンブリを関数/プロシージャに関連付けることができないようです...

32
Stefan Steiger

sys.Assembly_modules 見る:

select * from sys.Assembly_modules

これにより、すべての関数とそれらが定義されているアセンブリがリストされます。詳細については ブックのオンラインヘルプページ を参照してください。

共通言語ランタイム(CLR)アセンブリによって定義されている関数、プロシージャ、またはトリガーごとに1行を返します。

44
marc_s

次の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]

ご注意ください:

  1. ユーザー定義型(UDT)は、sys.Assembly_typesにあります。

  2. リストできるのは、CREATEステートメントで使用されたCLR参照のみです。まだCREATEによって参照されていないCLRメソッドを見つけることができません。つまり、「このアセンブリでSQLオブジェクトを作成できるメソッドのリストを教えてください」とは言えません。

7
Solomon Rutzky

ここでは、 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

また、その CLRオブジェクトが使用されているすべての場所を表示するオプションもあります

3
Mihai Bejenariu

以下は、カーソルを使用してサーバー上のすべての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
3

または、SELECT * FROM sys.dm_clr_appdomainsを使用できます。アセンブリのリストとそれらが格納されているデータベースを返します。

T

0
user7689973
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