Author |
Topic |
amitranjan
Starting Member
45 Posts |
Posted - 2010-02-23 : 02:45:32
|
Hi, I have a databse in sql 2008 in which i have triggers on Insert, Update and Delete. I am also having a replica of same db say backup where i need to copy all the triggers using scripts or any other method. I dont want to copy database.Thanks AMitamit Ranjan |
|
Kristen
Test
22859 Posts |
Posted - 2010-02-23 : 03:17:08
|
You can generate a script (in SSMS) of all the triggers you want to copy, and then run that script on the other machine. |
|
|
webfred
Master Smack Fu Yak Hacker
8781 Posts |
Posted - 2010-02-23 : 03:21:38
|
http://mangalpardeshi.blogspot.com/2009/03/script-all-store-procedures-in-database.htmlThere you can also see a select to create all triggers in a database No, you're never too old to Yak'n'Roll if you're too young to die. |
|
|
madhivanan
Premature Yak Congratulator
22864 Posts |
|
Kristen
Test
22859 Posts |
Posted - 2010-02-23 : 03:53:57
|
Personally I haven't found such a script that work. I don't know how SSMS does it, but all scripts I have seen (and sp_helptext) split overly long lines and truncate after the first page of SProc's script. |
|
|
madhivanan
Premature Yak Congratulator
22864 Posts |
Posted - 2010-02-23 : 04:14:29
|
quote: Originally posted by Kristen Personally I haven't found such a script that work. I don't know how SSMS does it, but all scripts I have seen (and sp_helptext) split overly long lines and truncate after the first page of SProc's script.
I am not sure. But when I tried my script it scripted out the script to text file as you see when you query sp_helptext 'procedure name'MadhivananFailing to plan is Planning to fail |
|
|
Kristen
Test
22859 Posts |
Posted - 2010-02-23 : 04:50:12
|
sp_helptext (source) says:/* NOTE: Length of @SyscomText is 4000 to replace the length of** text column in syscomments.** lengths on @Line, #CommentText Text column and** value for @DefinedLength are all 255. These need to all have** the same values. 255 was selected in order for the max length** display using down level clients*/ so I assume that is organised to work with Query Analyser etc. with column width set to 256 characters.There's a fairly significant amount of code in that SProc, so I doubt the "Select * From syscomments" style solutions are going to be up to much! |
|
|
amitranjan
Starting Member
45 Posts |
Posted - 2010-02-23 : 05:41:07
|
SELECT O.Name as ProcName ,M.Definition as CreateScript ,O.Create_Date ,O.Modify_Date FROM sys.sql_modules as M INNER JOIN sys.triggers as O ON M.object_id = O.object_id @ All I tried above script from mangal pardeshi and found it working with a small change. After modified above to thisSELECT M.Definition as CreateScript FROM sys.sql_modules as M INNER JOIN sys.triggers as O ON M.object_id = O.object_id this gave me all triggers of that database. Then i right clicked and exprted that as CSV file. Now opened it in Notepad++ or Sql Query Window and added SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGO at the beginning of each triger and executed on the desired database. And it ran!!!..amit Ranjan |
|
|
madhivanan
Premature Yak Congratulator
22864 Posts |
Posted - 2010-02-23 : 05:44:37
|
Also try the Link I posted. It scripts out all the triggers to a text file seperated by GOTry it and let us know the resultMadhivananFailing to plan is Planning to fail |
|
|
madhivanan
Premature Yak Congratulator
22864 Posts |
Posted - 2010-02-23 : 05:50:55
|
quote: Originally posted by Kristen sp_helptext (source) says:/* NOTE: Length of @SyscomText is 4000 to replace the length of** text column in syscomments.** lengths on @Line, #CommentText Text column and** value for @DefinedLength are all 255. These need to all have** the same values. 255 was selected in order for the max length** display using down level clients*/ so I assume that is organised to work with Query Analyser etc. with column width set to 256 characters.There's a fairly significant amount of code in that SProc, so I doubt the "Select * From syscomments" style solutions are going to be up to much!
I still dont understand your point. Are you saying that usage of sp_helptext is not reliable? This is the code that script out the script of sp_helptextCan you run this and see if all texts are exported?create table scripts(sps varchar(8000)) declare @texts varchar(1000)select @texts='sp_helptext '''+'sp_helptext'+'''' EXEC('insert into scripts(sps) EXEC '+ @texts) insert into scripts(sps) select 'GO'EXEC master..xp_cmdshell 'bcp "select * from dworksweb..scripts" queryout "c:\scripts.txt" -c -T' drop table scripts MadhivananFailing to plan is Planning to fail |
|
|
webfred
Master Smack Fu Yak Hacker
8781 Posts |
Posted - 2010-02-23 : 05:54:49
|
quote: Originally posted by amitranjan SELECT O.Name as ProcName ,M.Definition as CreateScript ,O.Create_Date ,O.Modify_Date FROM sys.sql_modules as M INNER JOIN sys.triggers as O ON M.object_id = O.object_id @ All I tried above script from mangal pardeshi and found it working with a small change. After modified above to thisSELECT M.Definition as CreateScript FROM sys.sql_modules as M INNER JOIN sys.triggers as O ON M.object_id = O.object_id this gave me all triggers of that database. Then i right clicked and exprted that as CSV file. Now opened it in Notepad++ or Sql Query Window and added SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGO at the beginning of each triger and executed on the desired database. And it ran!!!..amit Ranjan
Fine! No, you're never too old to Yak'n'Roll if you're too young to die. |
|
|
amitranjan
Starting Member
45 Posts |
Posted - 2010-02-23 : 05:56:03
|
quote: Originally posted by webfred
quote: Originally posted by amitranjan SELECT O.Name as ProcName ,M.Definition as CreateScript ,O.Create_Date ,O.Modify_Date FROM sys.sql_modules as M INNER JOIN sys.triggers as O ON M.object_id = O.object_id @ All I tried above script from mangal pardeshi and found it working with a small change. After modified above to thisSELECT M.Definition as CreateScript FROM sys.sql_modules as M INNER JOIN sys.triggers as O ON M.object_id = O.object_id this gave me all triggers of that database. Then i right clicked and exprted that as CSV file. Now opened it in Notepad++ or Sql Query Window and added SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGO at the beginning of each triger and executed on the desired database. And it ran!!!..amit Ranjan
Fine! No, you're never too old to Yak'n'Roll if you're too young to die.
Thanks you r a life saver...amit Ranjan |
|
|
Kristen
Test
22859 Posts |
Posted - 2010-02-23 : 05:56:58
|
"SELECT M.Definition as CreateScript FROM sys.sql_modules as M INNER JOIN sys.triggers as O ON M.object_id = O.object_id "Like I said, I don't think these simple SELECTs work 100%.This only selects the first 8,000 characters from the trigger. Maybe yours are smaller than that, maybe if I used BCP or somesuch I would work around that limit.Much easier to just use SSMS, right click, generate script, ...All the ANSI_NULLS, QUOTED_IDENTIFIER, ANSI_PADDING etc are correctly taken care off (you are assuming they should all be ON, that's not necessarily/universally the case) ... and maybe there are other things SSMS does which are potential pitfalls.If you want to export your objects as a scheduled task (to put them in version-control-system, or some such reason, then fine. I just don't think it is worth it for a one-off. |
|
|
webfred
Master Smack Fu Yak Hacker
8781 Posts |
Posted - 2010-02-23 : 06:00:05
|
A trigger with 8k chatacters would be the work of the devil No, you're never too old to Yak'n'Roll if you're too young to die. |
|
|
Kristen
Test
22859 Posts |
Posted - 2010-02-23 : 06:17:20
|
quote: Originally posted by madhivananI still dont understand your point. Are you saying that usage of sp_helptext is not reliable?
If you have a line in your SProc with more than 256 characters sp_HelpText will insert line-breaks at 256 character positions(s)quote: Can you run this and see if all texts are exported?
I did try it in SQL 2008. I get:output----------------------------------------------------------------------------------- SQLState = S1000, NativeError = 0Error = [Microsoft][SQL Server Native Client 10.0]Unable to open BCP host data-fileNULL but I did SELECT * FROM SCRIPTS and the lines are split at 256 character positionHere's an exampleCREATE PROCEDURE TEMP_LongLineASBEGIN-- NOTE: This needs to be all on one line! --..!....1....!....2....!....3....!....4....!....5....!....6....!....7....!....8....!....9....!..100 ...!....1....!....2....!....3....!....4....!....5....!....6....!....7....!....8....!....9....!..200 ...!....1....!....2....!....3....!....4....!....5....XY....6....!....7....!....8....!....9....!..300SELECT 1ENDGOsp_helptext 'TEMP_LongLine'GODROP PROCEDURE TEMP_LongLineGO gives meText----------------------------------------------------------- CREATE PROCEDURE TEMP_LongLineASBEGIN--..!....1....!....2....!....3....!....4....!....5... ...200....!....1....!....2....!....3....!....4....!....5....XY....6....!....7....!....8....!....9....!..300SELECT 1END I've chopped out the middle of the line to keep this post reasonable width, but I'm sure you get the idea (My Query Analyser is set to column-width of 8,000 chars) |
|
|
madhivanan
Premature Yak Congratulator
22864 Posts |
Posted - 2010-02-23 : 07:35:08
|
I get your point now.So do you think there is a change that a word can be splitted to next line that would cause syntax error?MadhivananFailing to plan is Planning to fail |
|
|
Kristen
Test
22859 Posts |
Posted - 2010-02-23 : 09:27:25
|
If it was in a quoted string that would probably change the behaviour of the application (but not upset SQL) sp_HelpText goes to a lot of trouble to split the text at 256 character boundary ...... and also to bolt-back-together the multiple (8,000 byte) text pages ...sys.sql_modules uses object_definition(sys.sysschobjs.id) - which seems to only get the first 8,000 characters ...sp_HelpText is interrogating sys.syscomments - which itself is a VIEW to bolt-back-together again all the (new) tables that have scripts in them.Would make more sense (with VARCHAR(MAX) now available etc.) to go straight to the underlying table I reckon ...Maybe there is a, newer, replacement SProc for sp_HelpText that gets the whole script? |
|
|
madhivanan
Premature Yak Congratulator
22864 Posts |
Posted - 2010-02-23 : 10:18:04
|
quote: Originally posted by Kristen If it was in a quoted string that would probably change the behaviour of the application (but not upset SQL) sp_HelpText goes to a lot of trouble to split the text at 256 character boundary ...... and also to bolt-back-together the multiple (8,000 byte) text pages ...sys.sql_modules uses object_definition(sys.sysschobjs.id) - which seems to only get the first 8,000 characters ...sp_HelpText is interrogating sys.syscomments - which itself is a VIEW to bolt-back-together again all the (new) tables that have scripts in them.Would make more sense (with VARCHAR(MAX) now available etc.) to go straight to the underlying table I reckon ...Maybe there is a, newer, replacement SProc for sp_HelpText that gets the whole script?
1 I dont think a single line of actual stored procedure may exceed 8000 characters in real life (One can write but very difficult to maintain and read)2 When query on object_defnition (object_id('myproc')) it displays first 8000 characters. But when you bcp out it exports all charactersMadhivananFailing to plan is Planning to fail |
|
|
Kristen
Test
22859 Posts |
Posted - 2010-02-23 : 10:47:03
|
I agree 8,000 characters per-line would be a reasonable limit - whereas I find I exceed 256 quite commonly.However, the 8,000 characters (or whatever) line may have to "span" two object_defnition (object_id('myproc')) blocks - but if they are silently concatenated when you use BCP you are "good-to-go"!! |
|
|
|