[SQL] 마이크로 소프트 SQL Server Management Studio를 사용하여 데이터베이스의 모든 트리거에 대한 스크립트를 생성하는 방법
SQL마이크로 소프트 SQL Server Management Studio를 사용하여 데이터베이스의 모든 트리거에 대한 스크립트를 생성하는 방법
나는 우리의 데이터베이스에 존재하는 트리거를 모두 만들 수있는 SQL이 포함 된 SQL 스크립트를 생성하고 싶습니다. 트리거는 데이터베이스 자체에 트리거 이외의 소스가 현재 없다, 그래서 창 쿼리 SSMS를 통해 직접 추가되었다.
난 이미 당신이 데이터베이스를 마우스 오른쪽 단추로 클릭 작업 -를 선택> 스크립트를 생성하고 사용 "스크립트 전체 데이터베이스와 모든 개체"옵션 방법을 시도했다. 이 테이블과 제약에 대한 SQL 스크립트를 생성 않지만, 그것은 트리거에 대한 SQL을 생성하지 않습니다.
나는 또한 내가 바로 데이터베이스에 각 트리거 클릭 할 수 있음을 이해하고 생성 SQL 스크립트 옵션을 선택하지만, 46 표 감사에서 현재이 (삽입, 업데이트 내용은 삭제).
오히려 수동 (46 개) 각 테이블에 대한 삽입, 업데이트 및 삭제 트리거 스크립트를 생성,이 작업을 수행하는 쉬운 방법은 무엇입니까? 또는, 나는 복사 및 붙여 넣기, 클릭을 시작해야합니까?
해결법
-
==============================
1.데이터베이스 -> 작업 -> 스크립트를 생성 -> 다음 -> 다음
데이터베이스 -> 작업 -> 스크립트를 생성 -> 다음 -> 다음
표 /보기 옵션 제목 아래, True로 스크립트 트리거를 설정, 스크립트 옵션 UI를 선택합니다.
-
==============================
2.나는 대답은 이미 받아 들여졌다 알고 있지만 어떤 이유로 SSMS 마법사에 대한 트리거를위한 스크립트를 생성 할 수없는 경우 (내 경우는 MSSQL2008R2했다)의 경우 또 다른 솔루션을 제공 할
나는 대답은 이미 받아 들여졌다 알고 있지만 어떤 이유로 SSMS 마법사에 대한 트리거를위한 스크립트를 생성 할 수없는 경우 (내 경우는 MSSQL2008R2했다)의 경우 또 다른 솔루션을 제공 할
이 용액을 상기의 다나 아이디어에 근거하지만 ( 'syscomments의'뷰 '문자'항목의 제한) 4000 개 문자를 초과하면 사용 'sql_modules는'대신 트리거의 전체 코드를 제공하도록
select [definition],'GO' from sys.sql_modules m inner join sys.objects obj on obj.object_id=m.object_id where obj.type ='TR'
"로 저장 ... 결과"결과 그리드 다음 마우스 오른쪽 클릭 보존 서식 파일로 저장
-
==============================
3.이건 어때요?
이건 어때요?
같은 텍스트 '% 트리거 % 만들기'하여 syscomments에서 텍스트를 선택
편집 - JJ의 코멘트 당 아래, 한 syscomments는 사용되지 않으며 미래에서 제거 될 예정입니다. 사용하십시오 중 하나 전진 위에 나열된 마법사 기반 또는 스크립트 기반 솔루션 :)
-
==============================
4.모든 트리거 스크립트에 저장 프로 시저를 정의 할 수 있습니다 :
모든 트리거 스크립트에 저장 프로 시저를 정의 할 수 있습니다 :
SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO -- Procedure: -- [dbo].[SYS_ScriptAllTriggers] -- -- Parameter: -- @ScriptMode bit -- possible values: -- 0 - Script ALTER only -- 1 - Script CREATE only -- 2 - Script DROP + CREATE ALTER PROCEDURE [dbo].[SYS_ScriptAllTriggers] @ScriptMode int = 0 AS BEGIN DECLARE @script TABLE (script varchar(max), id int identity (1,1)) DECLARE @SQL VARCHAR(8000), @Text NVARCHAR(4000), @BlankSpaceAdded INT, @BasePos INT, @CurrentPos INT, @TextLength INT, @LineId INT, @MaxID INT, @AddOnLen INT, @LFCR INT, @DefinedLength INT, @SyscomText NVARCHAR(4000), @Line NVARCHAR(1000), @UserName SYSNAME, @ObjID INT, @OldTrigID INT; SET NOCOUNT ON; SET @DefinedLength = 1000; SET @BlankSpaceAdded = 0; SET @ScriptMode = ISNULL(@ScriptMode, 0); -- This Part Validated the Input parameters DECLARE @Triggers TABLE (username SYSNAME NOT NULL, trigname SYSNAME NOT NULL, objid INT NOT NULL); DECLARE @TrigText TABLE (objid INT NOT NULL, lineid INT NOT NULL, linetext NVARCHAR(1000) NULL); INSERT INTO @Triggers (username, trigname, objid) SELECT DISTINCT OBJECT_SCHEMA_NAME(B.id), B.name, B.id FROM dbo.sysobjects B, dbo.syscomments C WHERE B.type = 'TR' AND B.id = C.id AND C.encrypted = 0; IF EXISTS(SELECT C.* FROM syscomments C, sysobjects O WHERE O.id = C.id AND O.type = 'TR' AND C.encrypted = 1) BEGIN insert into @script select '/*'; insert into @script select 'The following encrypted triggers were found'; insert into @script select 'The procedure could not write the script for it'; insert into @script SELECT DISTINCT '[' + OBJECT_SCHEMA_NAME(B.id) + '].[' + B.name + ']' --, B.id FROM dbo.sysobjects B, dbo.syscomments C WHERE B.type = 'TR' AND B.id = C.id AND C.encrypted = 1; insert into @script select '*/'; END; DECLARE ms_crs_syscom CURSOR LOCAL forward_only FOR SELECT T.objid, C.text FROM @Triggers T, dbo.syscomments C WHERE T.objid = C.id ORDER BY T.objid, C.colid FOR READ ONLY; SELECT @LFCR = 2; SELECT @LineId = 1; OPEN ms_crs_syscom; SET @OldTrigID = -1; FETCH NEXT FROM ms_crs_syscom INTO @ObjID, @SyscomText; WHILE @@fetch_status = 0 BEGIN SELECT @BasePos = 1; SELECT @CurrentPos = 1; SELECT @TextLength = LEN(@SyscomText); IF @ObjID <> @OldTrigID BEGIN SET @LineID = 1; SET @OldTrigID = @ObjID; END; WHILE @CurrentPos != 0 BEGIN --Looking for end of line followed by carriage return SELECT @CurrentPos = CHARINDEX(CHAR(13) + CHAR(10), @SyscomText, @BasePos); --If carriage return found IF @CurrentPos != 0 BEGIN WHILE ( ISNULL(LEN(@Line), 0) + @BlankSpaceAdded + @CurrentPos - @BasePos + @LFCR ) > @DefinedLength BEGIN SELECT @AddOnLen = @DefinedLength - (ISNULL(LEN(@Line), 0) + @BlankSpaceAdded ); INSERT @TrigText VALUES ( @ObjID, @LineId, ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText, @BasePos, @AddOnLen), N'')); SELECT @Line = NULL, @LineId = @LineId + 1, @BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0; END; SELECT @Line = ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText, @BasePos, @CurrentPos - @BasePos + @LFCR), N''); SELECT @BasePos = @CurrentPos + 2; INSERT @TrigText VALUES ( @ObjID, @LineId, @Line ); SELECT @LineId = @LineId + 1; SELECT @Line = NULL; END; ELSE --else carriage return not found BEGIN IF @BasePos <= @TextLength BEGIN /*If new value for @Lines length will be > then the **defined length */ WHILE ( ISNULL(LEN(@Line), 0) + @BlankSpaceAdded + @TextLength - @BasePos + 1 ) > @DefinedLength BEGIN SELECT @AddOnLen = @DefinedLength - ( ISNULL(LEN(@Line), 0 ) + @BlankSpaceAdded ); INSERT @TrigText VALUES ( @ObjID, @LineId, ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText, @BasePos, @AddOnLen), N'')); SELECT @Line = NULL, @LineId = @LineId + 1, @BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0; END; SELECT @Line = ISNULL(@Line, N'') + ISNULL(SUBSTRING(@SyscomText, @BasePos, @TextLength - @BasePos+1 ), N''); IF LEN(@Line) < @DefinedLength AND CHARINDEX(' ', @SyscomText, @TextLength + 1) > 0 BEGIN SELECT @Line = @Line + ' ', @BlankSpaceAdded = 1; END; END; END; END; FETCH NEXT FROM ms_crs_syscom INTO @ObjID, @SyscomText; END; IF @Line IS NOT NULL INSERT @TrigText VALUES ( @ObjID, @LineId, @Line ); CLOSE ms_crs_syscom; insert into @script select '-- You should run this result under dbo if your triggers belong to multiple users'; insert into @script select ''; IF @ScriptMode = 2 BEGIN insert into @script select '-- Dropping the Triggers'; insert into @script select ''; insert into @script SELECT 'IF EXISTS(SELECT * FROM sysobjects WHERE id = OBJECT_ID(''[' + username + '].[' + trigname + ']'')' + ' AND ObjectProperty(OBJECT_ID(''[' + username + '].[' + trigname + ']''), ''ISTRIGGER'') = 1)' + ' DROP TRIGGER [' + username + '].[' + trigname +']' + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) FROM @Triggers; END; IF @ScriptMode = 0 BEGIN update @TrigText set linetext = replace(linetext, 'CREATE TRIGGER', 'ALTER TRIGGER') WHERE upper(left(replace(ltrim(linetext), char(9), ''), 14)) = 'CREATE TRIGGER' END insert into @script select '----------------------------------------------'; insert into @script select '-- Creation of Triggers'; insert into @script select ''; insert into @script select ''; DECLARE ms_users CURSOR LOCAL forward_only FOR SELECT T.username, T.objid, MAX(D.lineid) FROM @Triggers T, @TrigText D WHERE T.objid = D.objid GROUP BY T.username, T.objid FOR READ ONLY; OPEN ms_users; FETCH NEXT FROM ms_users INTO @UserName, @ObjID, @MaxID; WHILE @@fetch_status = 0 BEGIN insert into @script select 'setuser N''' + @UserName + '''' + CHAR(13) + CHAR(10); insert into @script SELECT '-- Text of the Trigger' = CASE lineid WHEN 1 THEN 'GO' + CHAR(13) + CHAR(10) + linetext WHEN @MaxID THEN linetext + 'GO' ELSE linetext END FROM @TrigText WHERE objid = @ObjID ORDER BY lineid; insert into @script select 'setuser'; FETCH NEXT FROM ms_users INTO @UserName, @ObjID, @MaxID; END; CLOSE ms_users; insert into @script select 'GO'; insert into @script select '------End ------'; DEALLOCATE ms_crs_syscom; DEALLOCATE ms_users; select script from @script order by id END
그것을 실행하는 방법 :
SET nocount ON DECLARE @return_value INT EXEC @return_value = [dbo].[SYS_ScriptAllTriggers] @InclDrop = 1 SELECT 'Return Value' = @return_value
가다
-
==============================
5.여기에 해답의 조합 내 자신의 버전에서 발견 사용 및 기타 포스트 (원래 quetion를 찾을 수 없습니다.
여기에 해답의 조합 내 자신의 버전에서 발견 사용 및 기타 포스트 (원래 quetion를 찾을 수 없습니다.
select OBJECT_NAME(parent_obj) AS table_name,sysobj.name AS trigger_name, [definition],'GO' from sys.sql_modules m inner join sysobjects sysobj on sysobj.id=m.object_id INNER JOIN sys.tables t ON sysobj.parent_obj = t.object_id INNER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE sysobj.type = 'TR' and sysobj.name like 'NAME_OF_TRIGGER' order by sysobj.name
from https://stackoverflow.com/questions/13200511/how-to-generate-scripts-for-all-triggers-in-database-using-microsoft-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버에서 OPTION (MAXDOP 1)을 사용하는 목적은 무엇인가? (0) | 2020.06.27 |
---|---|
[SQL] 기본 키는 SQL Server의 필요가 있습니까? (0) | 2020.06.27 |
[SQL] GROUP BY - 그룹화하지 않음 NULL (0) | 2020.06.27 |
[SQL] 새 선택적 매개 변수를 허용하도록 SQL 서버 기능을 변경합니다 (0) | 2020.06.27 |
[SQL] 어떻게 SQL 데이터베이스 테이블에 날짜를 삽입? (0) | 2020.06.27 |