web-dev-qa-db-fra.com

SQL Server: comment répertorier toutes les fonctions / procédures / objets CLR pour l'assemblage

Question: Dans SQL Server 2005, comment puis-je répertorier toutes les fonctions/procédures SQL CLR qui utilisent l'assembly xy (par exemple MyFirstUdp)?

Par exemple, une fonction qui répertorie HelloWorld pour le paramètre de requête MyFirstUdp

CREATE PROCEDURE HelloWorld
AS EXTERNAL NAME MyFirstUdp.[SQL_CLRdll.MySQLclass].HelloWorld
GO

après avoir couru

CREATE Assembly MyFirstUdp FROM 'C:\Users\username\Documents\Visual Studio 2005\Projects\SQL_CLRdll\SQL_CLRdll\bin\Debug\SQL_CLRdll.dll

Je peux lister toutes les assemblées et toutes les fonctions/procédures, mais il me semble que je ne peux pas associer l'Assemblée aux fonctions/procédures ...

32
Stefan Steiger

Vérifiez sys.Assembly_modules vue:

select * from sys.Assembly_modules

Cela devrait répertorier toutes les fonctions et les assemblys dans lesquels elles sont définies. Consultez la page d'aide de Books Online à ce sujet.

Renvoie une ligne pour chaque fonction, procédure ou déclencheur défini par un assembly CLR (Common Language Runtime).

44
marc_s

J'utilise le SQL suivant:

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]

Notez s'il vous plaît:

  1. Les types définis par l'utilisateur (UDT) se trouvent dans: sys.Assembly_types

  2. Vous pouvez uniquement répertorier les références CLR qui ont été utilisées dans les instructions CREATE. Vous ne pouvez pas trouver de méthodes CLR qui n'ont pas encore été référencées par un CREATE. Vous ne pouvez pas dire: "donnez-moi une liste de méthodes dans cet assembly pour lesquelles je peux créer des objets SQL".

7
Solomon Rutzky

Voici un script trouvé sur 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

De plus, vous avez la possibilité de voir tous les endroits où cet objet CLR est utilisé .

3
Mihai Bejenariu

Voici une généralisation de la requête de srutzky (ci-dessus) qui parcourt toutes les bases de données d'un serveur à l'aide d'un curseur. Désolé pour le formatage, mais c'est pratique si vous devez rechercher parmi 500 bases de données dont vous avez hérité.

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

ou vous pouvez utiliser SELECT * FROM sys.dm_clr_appdomains; qui renvoie une liste des assemblys et dans quelle base de données ils sont stockés.

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
0