다음을 통해 공유


sp_refreshsqlmodule(Transact-SQL)

현재 데이터베이스에서 지정된 비스키마 바운드 저장 프로시저, 사용자 정의 함수, 뷰, DML 트리거, 데이터베이스 수준 DDL 트리거 또는 서버 수준 DDL 트리거에 대한 메타데이터를 업데이트합니다. 기본 개체가 변경되면 매개 변수의 데이터 형식과 같은 이러한 개체의 영구 메타데이터가 최신 상태를 유지하지 못할 수 있습니다.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙

구문

sys.sp_refreshsqlmodule [ @name = ] 'module_name' 
    [ , [ @namespace = ] ' <class> ' ]

<class> ::=
{
  | DATABASE_DDL_TRIGGER
  | SERVER_DDL_TRIGGER
}

인수

  • [ @name= ] 'module_name'
    저장 프로시저, 사용자 정의 함수, 뷰, DML 트리거, 데이터베이스 수준 DDL 트리거 또는 서버 수준 DDL 트리거의 이름입니다. module_name은 CLR(공용 언어 런타임) 저장 프로시저 또는 CLR 함수가 될 수 없습니다. module_name은 스키마에 바인딩될 수 없습니다. module_name은 nvarchar이며 기본값은 없습니다. module_name은 여러 부분으로 구성된 식별자가 될 수 있지만 현재 데이터베이스의 개체만 참조할 수 있습니다.

  • [ , @namespace = ] ' <class> '
    지정된 모듈의 클래스입니다. module_name이 DDL 트리거일 경우 <class>가 필요합니다. 올바른 입력은 DATABASE_DDL_TRIGGER 및 SERVER_DDL_TRIGGER입니다.

    <class>는 nvarchar(20)입니다.

반환 코드 값

0(성공) 또는 0이 아닌 수(실패)

주의

모듈의 기반이 되는 개체에 대한 변경 내용이 해당 개체의 정의에 영향을 주면 sp_refreshsqlmodule을 실행해야 합니다. 그렇지 않으면 모듈을 쿼리하거나 호출할 때 예기치 않은 결과가 발생할 수 있습니다. 뷰를 새로 고치려면 동일한 결과의 sp_refreshsqlmodule 또는 sp_refreshview를 사용합니다.

sp_refreshsqlmodule은 개체와 연관되어 있는 모든 사용 권한, 확장 속성 또는 SET 옵션에 영향을 주지 않습니다.

서버 수준 DDL 트리거를 새로 고치려면 아무 데이터베이스 컨텍스트에서 이 저장 프로시저를 실행하십시오.

[!참고]

sp_refreshsqlmodule을 실행하면 개체와 연관되어 있는 모든 서명이 삭제됩니다.

사용 권한

모듈에 대한 ALTER 권한 및 개체가 참조하는 CLR 사용자 정의 형식과 XML 스키마 컬렉션에 대한 REFERENCES 권한이 필요합니다. 지정된 모듈이 데이터베이스 수준 DDL 트리거일 경우 현재 데이터베이스에 ALTER ANY DATABASE DDL TRIGGER 권한이 필요합니다. 지정된 모듈이 서버 수준 DDL 트리거일 경우 CONTROL SERVER 권한이 필요합니다.

또한 EXECUTE AS 절로 정의되는 모듈의 경우 지정된 보안 주체에 대해 IMPERSONATE 권한이 필요합니다. 일반적으로 모듈이 EXECUTE AS USER로 정의되었으며 보안 주체의 사용자 이름이 모듈이 만들어진 때의 사용자와 다른 사용자로 확인되지 않는 이상 개체를 새로 고쳐도 EXECUTE AS 보안 주체가 변경되지 않습니다.

1.사용자 정의 함수 새로 고침

다음 예에서는 사용자 정의 함수를 새로 고칩니다. 이 예에서는 별칭 데이터 형식인 mytype과 mytype을 사용하는 사용자 정의 함수 to_upper를 만듭니다. 그런 다음 mytype의 이름을 myoldtype으로 바꾸고 다른 정의가 있는 새 mytype을 만듭니다. dbo.to_upper 함수를 새로 고치면 이전 항목 대신 새로 구현된 mytype이 참조됩니다.

-- Create an alias type.
USE AdventureWorks2012;
GO
IF EXISTS (SELECT 'mytype' FROM sys.types WHERE name = 'mytype')
DROP TYPE mytype;
GO

CREATE TYPE mytype FROM nvarchar(5);
GO

IF OBJECT_ID ('dbo.to_upper', 'FN') IS NOT NULL
DROP FUNCTION dbo.to_upper;
GO

CREATE FUNCTION dbo.to_upper (@a mytype)
RETURNS mytype
WITH ENCRYPTION
AS
BEGIN
RETURN upper(@a)
END;
GO

SELECT dbo.to_upper('abcde');
GO

-- Increase the length of the alias type.
sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO

CREATE TYPE mytype FROM nvarchar(10);
GO

-- The function parameter still uses the old type.
SELECT name, type_name(user_type_id) 
FROM sys.parameters 
WHERE object_id = OBJECT_ID('dbo.to_upper');
GO

SELECT dbo.to_upper('abcdefgh'); -- Fails because of truncation
GO

-- Refresh the function to bind to the renamed type.
EXEC sys.sp_refreshsqlmodule 'dbo.to_upper';

-- The function parameters are now bound to the correct type and the statement works correctly.
SELECT name, type_name(user_type_id) FROM sys.parameters
WHERE object_id = OBJECT_ID('dbo.to_upper');
GO

SELECT dbo.to_upper('abcdefgh');
GO

2.데이터베이스 수준 DDL 트리거 새로 고침

다음 예에서는 데이터베이스 수준 DDL 트리거를 새로 고칩니다.

USE AdventureWorks2012;
GO
EXEC sys.sp_refreshsqlmodule @name = 'ddlDatabaseTriggerLog' , @namespace = 'DATABASE_DDL_TRIGGER';
GO

3.서버 수준 DDL 트리거 새로 고침

다음 예에서는 서버 수준 DDL 트리거를 새로 고칩니다.

USE master;
GO
EXEC sys.sp_refreshsqlmodule @name = 'ddl_trig_database' , @namespace = 'SERVER_DDL_TRIGGER';
GO

참고 항목

참조

sp_refreshview(Transact-SQL)

데이터베이스 엔진 저장 프로시저(Transact-SQL)