当前位置:Gxlcms >
数据库问题 >
SQL Server ->> 重新创建Assembly和自动重建相关的数据库编程对象(存储过程,函数和触发器)
SQL Server ->> 重新创建Assembly和自动重建相关的数据库编程对象(存储过程,函数和触发器)
时间:2021-07-01 10:21:17
帮助过:2人阅读
EXISTS(
SELECT * FROM sys.procedures
WHERE name
= ‘usp_RecreateAssemblyAndInvolvedSQLObjects‘ AND schema_id
= schema_id(
‘dbo‘))
DROP PROCEDURE dbo.usp_RecreateAssemblyAndInvolvedSQLObjects
GO
CREATE PROCEDURE dbo.usp_RecreateAssemblyAndInvolvedSQLObjects
@assembly_name SYSNAME,
@new_binary_string NVARCHAR(
MAX),
@permission_set NVARCHAR(
50)
= NULL,
@not_exists_create BIT = 0
AS
BEGIN
SET NOCOUNT
ON
IF OBJECT_ID(
‘tempdb..#t‘)
IS NOT NULL
DROP TABLE #t
CREATE TABLE #t(id
INT IDENTITY(
1,
1), drop_sqlobject_cmd
NVARCHAR(
MAX), create_sqlobject_cmd
NVARCHAR(
MAX))
IF OBJECT_ID(
‘tempdb..#cmd‘)
IS NOT NULL
DROP TABLE #cmd
CREATE TABLE #cmd(id
INT IDENTITY(
1,
1), cmd
NVARCHAR(
MAX))
DECLARE @cmd AS NVARCHAR(
MAX)
DECLARE @msg NVARCHAR(
4000)
IF NOT EXISTS(
SELECT * FROM sys.assemblies
WHERE name
= @assembly_name)
BEGIN
IF @not_exists_create = 1
BEGIN
IF @permission_set NOT IN (
‘SAFE‘,
‘EXTERNAL_ACCESS‘,
‘UNSAFE‘)
BEGIN
RAISERROR(
‘PERMISSION_SET in "CREATE ASSEMBLY" command should only be one of values: SAFE, EXTERNAL_ACCESS, UNSAFE.‘,
16,
1)
RETURN
END
SET @cmd = ‘/**************************** recreate assembly ‘ + QUOTENAME(
@assembly_name)
+ ‘ with the new binary string ****************************/‘ + REPLICATE(
CHAR(
13)
+ CHAR(
10),
2)
INSERT #cmd
VALUES(
@cmd)
SET @cmd = ‘CREATE ASSEMBLY ‘ + QUOTENAME(
@assembly_name)
+ CHAR(
13)
+ CHAR(
10)
+
‘FROM ‘ + CAST(
@new_binary_string AS NVARCHAR(
MAX))
+ CHAR(
13)
+ CHAR(
10)
+
‘WITH PERMISSION_SET = ‘ + @permission_set + CHAR(
13)
+ CHAR(
10)
+ ‘;‘ + CHAR(
13)
+ CHAR(
10)
+ ‘;‘ + CHAR(
13)
+ CHAR(
10)
+
‘GO‘
INSERT #cmd
VALUES(
@cmd)
GOTO CombineCmdString
END
ELSE
BEGIN
SET @msg = ‘Assembly "‘ + @assembly_name + ‘" doesn‘‘t exist in the database‘
RAISERROR(
@msg,
16,
1)
RETURN
END
END
INSERT #t(drop_sqlobject_cmd, create_sqlobject_cmd)
SELECT ‘DROP ‘ + CASE obj.type_desc
WHEN ‘CLR_STORED_PROCEDURE‘ THEN ‘ PROCEDURE ‘
WHEN ‘CLR_SCALAR_FUNCTION‘ THEN ‘ FUNCTION ‘
WHEN ‘CLR_TABLE_VALUED_FUNCTION‘ THEN ‘ FUNCTION ‘
WHEN ‘CLR_TRIGGER‘ THEN ‘TRIGGER‘
ELSE ‘‘ END + QUOTENAME(sch.name)
+ ‘.‘ + QUOTENAME(obj.name)
+ CASE obj.type_desc
WHEN ‘CLR_TRIGGER‘ THEN ‘ ON ‘ + QUOTENAME(prn_sch.name)
+ ‘.‘ + QUOTENAME(prn_obj.name)
ELSE ‘‘ END
+ ‘;‘ + CHAR(
13)
+ CHAR(
10)
+ ‘GO‘ + CHAR(
13)
+ CHAR(
10)
AS drop_sqlobject_cmd,
‘CREATE‘ + CASE obj.type_desc
WHEN ‘CLR_STORED_PROCEDURE‘ THEN ‘ PROCEDURE ‘
WHEN ‘CLR_SCALAR_FUNCTION‘ THEN ‘ FUNCTION ‘
WHEN ‘CLR_TABLE_VALUED_FUNCTION‘ THEN ‘ FUNCTION ‘
WHEN ‘CLR_TRIGGER‘ THEN ‘TRIGGER‘
ELSE ‘‘ END + QUOTENAME(sch.name)
+ ‘.‘ + QUOTENAME(obj.name)
+ par.param_list
+ CHAR(
13)
+ CHAR(
10)
+ CASE WHEN ass_mod.execute_as_principal_id
IS NULL THEN ‘WITH EXECUTE AS CALLER ‘
WHEN ass_mod.execute_as_principal_id
= -2 THEN ‘WITH EXECUTE AS OWNER ‘
ELSE ‘WITH EXECUTE AS ‘‘‘ + dp.name
+ ‘‘‘‘ END
+ CHAR(
13)
+ CHAR(
10)
+ ‘AS EXTERNAL NAME ‘
+ QUOTENAME(ass.name)
+ ‘.‘ + QUOTENAME(ass_mod.assembly_class)
+ ‘.‘ + QUOTENAME(ass_mod.assembly_method)
+ ‘;‘ + CHAR(
13)
+ CHAR(
10)
+ ‘GO‘ + CHAR(
13)
+ CHAR(
10)
AS create_sqlobject_cmd
FROM sys.assembly_modules ass_mod
JOIN
sys.objects obj ON ass_mod.
object_id = obj.
object_id JOIN
sys.schemas sch ON sch.schema_id
= obj.schema_id
JOIN
sys.assembly_files ass_f ON ass_f.assembly_id
= ass_mod.assembly_id
JOIN
sys.assemblies ass ON ass.assembly_id
= ass_f.assembly_id
LEFT JOIN
sys.objects prn_obj ON prn_obj.
object_id = obj.parent_object_id
LEFT JOIN
sys.schemas prn_sch ON prn_sch.schema_id
= prn_obj.schema_id
LEFT JOIN
sys.database_principals dp ON dp.principal_id
= ass_mod.execute_as_principal_id
CROSS APPLY
( SELECT STUFF((
SELECT ‘,‘ + CHAR(
13)
+ CHAR(
10)
+ par.name
+ SPACE(
1)
+ UPPER(tp.name)
+
CASE WHEN tp.name
IN (
‘nchar‘,
‘nvarchar‘)
THEN ‘(‘ + IIF(tp.max_length
= -1,
‘MAX‘,
CAST(tp.max_length
/2 AS NVARCHAR(
10)))
+ ‘)‘
WHEN tp.name
IN (
‘datetime2‘,
‘datetimeoffset‘,
‘time‘)
THEN ‘(‘ + CAST(tp.scale
AS NVARCHAR(
10))
+ ‘)‘
WHEN tp.name
IN (
‘binary‘,
‘char‘,
‘varbinary‘,
‘varchar‘)
THEN CAST(tp.max_length
AS NVARCHAR(
10))
WHEN tp.name
IN (
‘decimal‘,
‘numeric‘)
THEN ‘(‘ + CAST(tp.
precision AS NVARCHAR(
10))
+ ‘,‘ + CAST(tp.scale
AS NVARCHAR(
10))
+ ‘)‘
ELSE ‘‘ END
+ IIF(par.is_output
<> 0,
‘ OUTPUT ‘,
‘‘ )
+ IIF(par.is_readonly
<> 0,
‘ READONLY ‘,
‘‘)
+ IIF(par.has_default_value
<> 0,
‘ = ‘‘‘ + CAST(par.default_value
AS NVARCHAR(
MAX))
+ ‘‘‘‘,
‘‘)
FROM sys.parameters par
JOIN
sys.types tp ON tp.system_type_id
= par.system_type_id
WHERE tp.name
<> ‘sysname‘ AND par.
object_id = obj.
object_id
ORDER BY par.parameter_id
FOR XML PATH(
‘‘), TYPE).value(
‘.‘,
‘nvarchar(max)‘),
1,
2,
‘‘)
AS param_list)
as par
WHERE ass.name
= @assembly_name;
SET @cmd = ‘/**************************** Drop CLR sql obbjects that reference assembly ‘ + QUOTENAME(
@assembly_name)
+ ‘ ****************************/‘ + REPLICATE(
CHAR(
13)
+ CHAR(
10),
2)
INSERT #cmd
VALUES(
@cmd)
SET @cmd = (
SELECT drop_sqlobject_cmd
+ CHAR(
13)
+ CHAR(
10)
AS drop_sqlobject_cmd
FROM #t
ORDER BY id
FOR XML PATH(
‘‘), TYPE).value(
‘.‘,
‘nvarchar(max)‘)
INSERT #cmd
VALUES(
@cmd)
SET @cmd = ‘/**************************** Drop assembly ‘ + QUOTENAME(
@assembly_name)
+ ‘ ****************************/‘ + REPLICATE(
CHAR(
13)
+ CHAR(
10),
2)
INSERT #cmd
VALUES(
@cmd)
SET @cmd = ‘DROP ASSEMBLY ‘ + QUOTENAME(
@assembly_name)
+ ‘;‘ + CHAR(
13)
+ CHAR(
10)
+ ‘GO‘ + CHAR(
13)
+ CHAR(
10)
INSERT #cmd
VALUES(
@cmd)
SET @cmd = ‘/**************************** recreate assembly ‘ + QUOTENAME(
@assembly_name)
+ ‘ with the new binary string ****************************/‘ + REPLICATE(
CHAR(
13)
+ CHAR(
10),
2)
INSERT #cmd
VALUES(
@cmd)
SET @cmd = (
SELECT ‘CREATE ASSEMBLY ‘ + QUOTENAME(name)
+ CHAR(
13)
+ CHAR(
10)
+
‘FROM ‘ + CAST(
@new_binary_string AS NVARCHAR(
MAX))
+ CHAR(
13)
+ CHAR(
10)
+
‘WITH PERMISSION_SET = ‘ + IIF(
@permission_set IS NULL,
CASE permission_set
WHEN 1 THEN ‘SAFE‘ WHEN 2 THEN ‘EXTERNAL_ACCESS‘ WHEN 3 THEN ‘UNSAFE‘ END,
@permission_set)
+ ‘;‘ + CHAR(
13)
+ CHAR(
10)
+
‘GO‘ + CHAR(
13)
+ CHAR(
10)
FROM sys.assemblies
WHERE name
= @assembly_name)
INSERT #cmd
VALUES(
@cmd)
SET @cmd = ‘/**************************** recreate CLR sql obbjects that reference assembly ‘ + QUOTENAME(
@assembly_name)
+ ‘ ****************************/‘ + REPLICATE(
CHAR(
13)
+ CHAR(
10),
2)
INSERT #cmd
VALUES(
@cmd)
SET @cmd = (
SELECT create_sqlobject_cmd
+ CHAR(
13)
+ CHAR(
10)
AS create_sqlobject_cmd
FROM #t
ORDER BY id
FOR XML PATH(
‘‘), TYPE).value(
‘.‘,
‘nvarchar(max)‘)
INSERT #cmd
VALUES(
@cmd)
CombineCmdString:
SET @cmd = (
SELECT (
SELECT cmd
FROM #cmd
ORDER BY ID
FOR XML PATH(
‘‘), TYPE).value(
‘.‘,
‘nvarchar(max)‘))
EXEC (
@cmd)
END
GO
SQL Server ->> 重新创建Assembly和自动重建相关的数据库编程对象(存储过程,函数和触发器)
标签: