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 ...
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).
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:
Les types définis par l'utilisateur (UDT) se trouvent dans: sys.Assembly_types
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".
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é .
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
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
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