473,554 Members | 2,530 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Mysterious Trigger error DB2 UDB v8.1.5

I am trying to create a duplicate prevention trigger:

CREATE TRIGGER is3.ard_u_uniqu e
BEFORE UPDATE OF act_recov_date ON is3.flushes
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (N.act_recov_da te IS NOT NULL)
BEGIN ATOMIC
select count(*) into v_n
from is3.flushes
where bhid=N.bhid
and act_recov_date= N.act_recov_dat e;
if v_n>0 then
SIGNAL SQLSTATE ’75000’
SET MESSAGE_TEXT=’D uplicate actual recovery date’;
end if;
END

When I run it I receive the error message:

DB2 SQL error: SQLCODE: -7, SQLSTATE: 42601, SQLERRMC: ;SIGNAL SQLSTATE
Message: The character " " following "SIGNAL SQLSTATE" is not valid.
Line: 12

As far as I can see, the SIGNAL statement is well formed, so the error
is elsewhere, but I don't se the error.

Any help would be appreciated.

PS Is there any syntax for 'BEFORE UPDATE OR INSERT'? I didn't find it,
but that don't mean much in the many megabytes (gigabytes?) of
documentation,
Nov 12 '05 #1
12 4740
Bob Stearns wrote:
I am trying to create a duplicate prevention trigger:

CREATE TRIGGER is3.ard_u_uniqu e
BEFORE UPDATE OF act_recov_date ON is3.flushes
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (N.act_recov_da te IS NOT NULL)
BEGIN ATOMIC
select count(*) into v_n
from is3.flushes
where bhid=N.bhid
and act_recov_date= N.act_recov_dat e;
if v_n>0 then
SIGNAL SQLSTATE ’75000’
SET MESSAGE_TEXT=’D uplicate actual recovery date’;
end if;
END

When I run it I receive the error message:

DB2 SQL error: SQLCODE: -7, SQLSTATE: 42601, SQLERRMC: ;SIGNAL SQLSTATE
Message: The character " " following "SIGNAL SQLSTATE" is not valid.
Line: 12 Is this DB2 UDB for LUW? I'm a tad surprised by the SQLCODE -7. Would
expect a -104.
Anyway in LUW "SELECT INTO" is not supported in a trigger.
Either way doing a count(*) just to test existence is one expensive mode
of operation (and you better not running RS or RR isolation....!)
Try this:
CREATE TRIGGER is3.ard_u_uniqu e
BEFORE UPDATE OF act_recov_date ON is3.flushes
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN EXISTS(SELECT FROM is3.flushes
WHERE bhid=N.bhid
and act_recov_date= N.act_recov_dat e
and N.act_recov_dat e IS NOT NULL)
SIGNAL SQLSTATE ’75000’
SET MESSAGE_TEXT=’D uplicate actual recovery date’;

You will be pleasantly surprised by the snappyness of the beast,
especially on DPF :-)
PS Is there any syntax for 'BEFORE UPDATE OR INSERT'? I didn't find it,
but that don't mean much in the many megabytes (gigabytes?) of
documentation, Shockingly enough the reference is rather organized ;-)
-CREATE TRIGGER--trigger-name--+-NO CASCADE BEFORE-+---------->

+-AFTER-------------+
'-INSTEAD OF--------'
--+-INSERT--------------------------+--ON--+-table-name-+------>

+-DELETE--------------------------+ '-view-name--'
'-UPDATE--+---------------------+-'
| .-,-----------. |
| V | |
'-OF----column-name-+-'

There is no loop-back covering INSERT, DELETE, UPDATE. So the answer is
no. No need to go hunting thorugh the other gig of docs.

Truth be told. Your request popps up once in a whiel, but typically the
reaction is: "Oh well..". You can use CALL in Trigger to encapuslate and
share more complex logic.

Cheers
Serge
--
Serge Rielau
DB2 SQL Compiler Development
IBM Toronto Lab
Nov 12 '05 #2
Serge Rielau wrote:
Bob Stearns wrote:
I am trying to create a duplicate prevention trigger:

CREATE TRIGGER is3.ard_u_uniqu e
BEFORE UPDATE OF act_recov_date ON is3.flushes
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (N.act_recov_da te IS NOT NULL)
BEGIN ATOMIC
select count(*) into v_n
from is3.flushes
where bhid=N.bhid
and act_recov_date= N.act_recov_dat e;
if v_n>0 then
SIGNAL SQLSTATE ’75000’
SET MESSAGE_TEXT=’D uplicate actual recovery date’;
end if;
END

When I run it I receive the error message:

DB2 SQL error: SQLCODE: -7, SQLSTATE: 42601, SQLERRMC: ;SIGNAL SQLSTATE
Message: The character " " following "SIGNAL SQLSTATE" is not valid.
Line: 12


Is this DB2 UDB for LUW? I'm a tad surprised by the SQLCODE -7. Would
expect a -104.
Anyway in LUW "SELECT INTO" is not supported in a trigger.
Either way doing a count(*) just to test existence is one expensive mode
of operation (and you better not running RS or RR isolation....!)
Try this:
CREATE TRIGGER is3.ard_u_uniqu e
BEFORE UPDATE OF act_recov_date ON is3.flushes
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN EXISTS(SELECT FROM is3.flushes
WHERE bhid=N.bhid
and act_recov_date= N.act_recov_dat e
and N.act_recov_dat e IS NOT NULL)
SIGNAL SQLSTATE ’75000’
SET MESSAGE_TEXT=’D uplicate actual recovery date’;

You will be pleasantly surprised by the snappyness of the beast,
especially on DPF :-)
PS Is there any syntax for 'BEFORE UPDATE OR INSERT'? I didn't find
it, but that don't mean much in the many megabytes (gigabytes?) of
documentation,


Shockingly enough the reference is rather organized ;-)
>>-CREATE TRIGGER--trigger-name--+-NO CASCADE BEFORE-+---------->

+-AFTER-------------+
'-INSTEAD OF--------'
>--+-INSERT--------------------------+--ON--+-table-name-+------>

+-DELETE--------------------------+ '-view-name--'
'-UPDATE--+---------------------+-'
| .-,-----------. |
| V | |
'-OF----column-name-+-'

There is no loop-back covering INSERT, DELETE, UPDATE. So the answer is
no. No need to go hunting thorugh the other gig of docs.

Truth be told. Your request popps up once in a whiel, but typically the
reaction is: "Oh well..". You can use CALL in Trigger to encapuslate and
share more complex logic.

Cheers
Serge


Thank you, I didn't remember the EXISTS predicate. A NULL usage /
interpretation question from your example occurs to me. Given the

and act_recov_date= N.act_recov_dat e

phrase, isn't the phrase

and N.act_recov_dat e IS NOT NULL

redundant? I thought NULL=NULL was unknown, therefore not true.

That is the definition from the 'SQL Reference Volume 2' manual, I
believe, and I agree with you. That there are no later definitions is
harder to determine. When does IBM plan (to your knowledge, of course)
to create a new set of complete downloadable manuals? At the advent of
(the hypothetical, I know, I know) Version 9 or at some earlier point?
It would reduce (not eliminate) the need for searching multiple sources,
especially those which must be searched on line, for such questions.
Nov 12 '05 #3
Serge Rielau wrote:
Bob Stearns wrote:
I am trying to create a duplicate prevention trigger:

CREATE TRIGGER is3.ard_u_uniqu e
BEFORE UPDATE OF act_recov_date ON is3.flushes
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (N.act_recov_da te IS NOT NULL)
BEGIN ATOMIC
select count(*) into v_n
from is3.flushes
where bhid=N.bhid
and act_recov_date= N.act_recov_dat e;
if v_n>0 then
SIGNAL SQLSTATE ’75000’
SET MESSAGE_TEXT=’D uplicate actual recovery date’;
end if;
END

When I run it I receive the error message:

DB2 SQL error: SQLCODE: -7, SQLSTATE: 42601, SQLERRMC: ;SIGNAL SQLSTATE
Message: The character " " following "SIGNAL SQLSTATE" is not valid.
Line: 12


Is this DB2 UDB for LUW? I'm a tad surprised by the SQLCODE -7. Would
expect a -104.
Anyway in LUW "SELECT INTO" is not supported in a trigger.
Either way doing a count(*) just to test existence is one expensive mode
of operation (and you better not running RS or RR isolation....!)
Try this:
CREATE TRIGGER is3.ard_u_uniqu e
BEFORE UPDATE OF act_recov_date ON is3.flushes
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN EXISTS(SELECT FROM is3.flushes
WHERE bhid=N.bhid
and act_recov_date= N.act_recov_dat e
and N.act_recov_dat e IS NOT NULL)
SIGNAL SQLSTATE ’75000’
SET MESSAGE_TEXT=’D uplicate actual recovery date’;

You will be pleasantly surprised by the snappyness of the beast,
especially on DPF :-)
PS Is there any syntax for 'BEFORE UPDATE OR INSERT'? I didn't find
it, but that don't mean much in the many megabytes (gigabytes?) of
documentation,


Shockingly enough the reference is rather organized ;-)
>>-CREATE TRIGGER--trigger-name--+-NO CASCADE BEFORE-+---------->

+-AFTER-------------+
'-INSTEAD OF--------'
>--+-INSERT--------------------------+--ON--+-table-name-+------>

+-DELETE--------------------------+ '-view-name--'
'-UPDATE--+---------------------+-'
| .-,-----------. |
| V | |
'-OF----column-name-+-'

There is no loop-back covering INSERT, DELETE, UPDATE. So the answer is
no. No need to go hunting thorugh the other gig of docs.

Truth be told. Your request popps up once in a whiel, but typically the
reaction is: "Oh well..". You can use CALL in Trigger to encapuslate and
share more complex logic.

Cheers
Serge


We both missed the actual cause of the error. I copied some of the code
from the manual, and the apostrophes were not apostrophes (ASCII 39) but
rather a high bit character (ASCII 146) which is almost an apostrophe in
appearance.

Now on to the next problem. After correcting the problem with the almost
apostrophes, I tried building the trigger as you gave it and got the
following message:

DB2 SQL error: SQLCODE: -104, SQLSTATE: 42601, SQLERRMC: WHEN
EXISTS(SELECT;A CH ROW MODE DB2SQL
;<space>
Message: An unexpected token "WHEN EXISTS(SELECT" was found following
"ACH ROW MODE DB2SQL
". Expected tokens may include: "<space>".

There were three problems according to my interpretation of the syntax
diagram: 'NO CASCADE' is needed before 'BEFORE'; a set of parentheses is
needed around the 'WHEN' condition; and the semicolon is not allowed
after the 'SIGNAL ...' statement in this format. When all the errors
were corrected, the trigger built as desired.

The error message for the original trigger definition (after the almost
apostrophes were corrected is apparently wrong. It is:

DB2 SQL error: SQLCODE: -104, SQLSTATE: 42601, SQLERRMC: v_n;select
count(*) into;<space>
Message: An unexpected token "v_n" was found following "select
count(*) into". Expected tokens may include: "<space>".

It should be:

DB2 SQL error: SQLCODE: -104, SQLSTATE: 42601, SQLERRMC: into;select
count(*) ;<space>
Message: An unexpected token "into" was found following "select
count(*)". Expected tokens may include: "<space>".

but the syntax scanner can not differentiate into (the keyword) from
into (the column alias). It would be nice to be able to make 'AS'
mandatory in select statements; it would have to be some sort of pragma
or option to keep the standard purists happy, but it would make message
interpretation easier.
Nov 12 '05 #4
1. You are correct with NULL = NULL being UNKNOWN and thus NOT TRUE.
I was thinking about thsi one and figured that the optimzier may
have a chance to avoid executing the scan if the transition variable is
NULL to begin with. Just an optimization gamble which may or may not
have an effect.
2. Your explanation on the quote does indeed explain the -7 instead of
the -104. The -7 is caused by the Lexer.
3. NO CASCADE as well as MODE DB2SQL are now optional (and the only
default). Since it's harmless the docs will be updated in Viper.
You be on an older V8 release.
SQL Standard LATERAL (insetad of TABLE) has arrived quietly as well...
4. I'm not sure whether there will be another refresh for downloadable
docs in V8. If you get the "mryan" entity to answer.. rumours have it he
knows more than I do on the topic.
5. Forcing "AS" does not look like a popular choice to me. ;-)

Cheers
Serge
--
Serge Rielau
DB2 Solutions Development
IBM Toronto Lab
Nov 12 '05 #5
Serge Rielau wrote:
1. You are correct with NULL = NULL being UNKNOWN and thus NOT TRUE.
I was thinking about thsi one and figured that the optimzier may
have a chance to avoid executing the scan if the transition variable is
NULL to begin with. Just an optimization gamble which may or may not
have an effect.
2. Your explanation on the quote does indeed explain the -7 instead of
the -104. The -7 is caused by the Lexer.
3. NO CASCADE as well as MODE DB2SQL are now optional (and the only
default). Since it's harmless the docs will be updated in Viper.
You be on an older V8 release.
SQL Standard LATERAL (insetad of TABLE) has arrived quietly as well...
4. I'm not sure whether there will be another refresh for downloadable
docs in V8. If you get the "mryan" entity to answer.. rumours have it he
knows more than I do on the topic.
5. Forcing "AS" does not look like a popular choice to me. ;-)

Cheers
Serge

Thanks for the comprehensive reply.

WRT item 3, I have downloaded a portion of the pdf manual set, but the
changes are apparently in the set which is not downloadable yet.

I was suggesting a 'forcing AS' option for those of us the like strongly
typed languages. Kind of like having your (PL/I, FORTRAN, BASIC, etc.)
require all variables to be declared. The standards don't require it but
at least some compilers/interpreters have an option which forces it.

On another thread (Best Practice, 9/18/05 4:05 AM) I wanted to know if I
could use either DEFAULT or GENERATED+CASE to have an update to one
column force an update to another? Could I entice you to take a look and
comment?
Nov 12 '05 #6
If I may, here is the plan for documentation updates for V8.

The DB2 UDB V8 documentation is delivered in 3 forms:
- web-based Information Center
(http://publib.boulder.ibm.com/infoce...help/index.jsp)
- locally installable Information Center
- PDF
(http://www-306.ibm.com/software/data...manualsv8.html)

The latest version of the documentation for V8 is the web-based
Information Center. The web-based V8 Information Center has been
updated to reflect changes in FP9, and we plan to make at least one
more set of updates to the web-based V8 Information Center.

The locally installable Information Center and most of the PDF manuals
were updated for V 8.2 / FP7. At this time we do not plan to make
further updates to the locally installable version of the V8
Information Center, and we do not plan to make further updates to the
V8 PDF documentation.

Feel free to ping me at mr***@ca.ibm.co m if you would like more
details, or if you have questions about the rationale for this plan.
Mark Ryan
DB2 UDB User Technology
IBM Software Solutions Toronto Laboratory

Nov 12 '05 #7
In article <11************ **********@o13g 2000cwo.googleg roups.com>,
mr***@ca.ibm.co m says...
If I may, here is the plan for documentation updates for V8.

The DB2 UDB V8 documentation is delivered in 3 forms:
- web-based Information Center
(http://publib.boulder.ibm.com/infoce...help/index.jsp)
- locally installable Information Center
- PDF
(http://www-306.ibm.com/software/data...manualsv8.html)

The latest version of the documentation for V8 is the web-based
Information Center. The web-based V8 Information Center has been
updated to reflect changes in FP9, and we plan to make at least one
more set of updates to the web-based V8 Information Center.

The locally installable Information Center and most of the PDF manuals
were updated for V 8.2 / FP7. At this time we do not plan to make
further updates to the locally installable version of the V8
Information Center, and we do not plan to make further updates to the
V8 PDF documentation.

Feel free to ping me at mr***@ca.ibm.co m if you would like more
details, or if you have questions about the rationale for this plan.
Mark Ryan
DB2 UDB User Technology
IBM Software Solutions Toronto Laboratory

I would be a good thing if the locally installable Information Center
could be updated with every fixpack.
It wouldn't be a big problem if the release notes supplied with every
fixpack contains all the documentation updates but unfortunately we can
not be sure. The ADMIN_CMD function and a couple of others are not
described so how are we supposed to know that they are available?

But why can't the local IC be automatically updated. Only updated or new
pages need to be downloaded. I guess there must be some programmers
available within IBM with this kind of experience to get this
implemented. A lot of products use the same Eclipse based help nowadays
so a joined effort shouldn't be a problem.

Nov 12 '05 #8
mr***@ca.ibm.co m wrote:
If I may, here is the plan for documentation updates for V8.

The DB2 UDB V8 documentation is delivered in 3 forms:
- web-based Information Center
(http://publib.boulder.ibm.com/infoce...help/index.jsp)
- locally installable Information Center
- PDF
(http://www-306.ibm.com/software/data...manualsv8.html)

The latest version of the documentation for V8 is the web-based
Information Center. The web-based V8 Information Center has been
updated to reflect changes in FP9, and we plan to make at least one
more set of updates to the web-based V8 Information Center.

The locally installable Information Center and most of the PDF manuals
were updated for V 8.2 / FP7. At this time we do not plan to make
further updates to the locally installable version of the V8
Information Center, and we do not plan to make further updates to the
V8 PDF documentation.

Feel free to ping me at mr***@ca.ibm.co m if you would like more
details, or if you have questions about the rationale for this plan.
Mark Ryan
DB2 UDB User Technology
IBM Software Solutions Toronto Laboratory

Thanks a lot for the update. I hadn't been to pdf source in a while, and
your mentioning the 8.2 update caused me to look again and update my
local copies.
Nov 12 '05 #9
mr***@ca.ibm.co m wrote:
If I may, here is the plan for documentation updates for V8.

The DB2 UDB V8 documentation is delivered in 3 forms:
- web-based Information Center
(http://publib.boulder.ibm.com/infoce...help/index.jsp)
- locally installable Information Center
- PDF
(http://www-306.ibm.com/software/data...manualsv8.html)

The latest version of the documentation for V8 is the web-based
Information Center. The web-based V8 Information Center has been
updated to reflect changes in FP9, and we plan to make at least one
more set of updates to the web-based V8 Information Center.

The locally installable Information Center and most of the PDF manuals
were updated for V 8.2 / FP7. At this time we do not plan to make
further updates to the locally installable version of the V8
Information Center, and we do not plan to make further updates to the
V8 PDF documentation.

Feel free to ping me at mr***@ca.ibm.co m if you would like more
details, or if you have questions about the rationale for this plan.
Mark Ryan
DB2 UDB User Technology
IBM Software Solutions Toronto Laboratory

I don't know if here is the appropriate forum to register a complaint
about a manual or not. If not someone will certainly redirect me.

In the DB2 v8.2 SQL Reference Vol 2, we have lost the easy
differentiation of SQL/PL statements vs general SQL statements. There
could be at least a single page containing a list (and maybe syntax
diagrams hint hint) of these statements. In the HTML context, this short
page could contain reference to the real pages. I, at least, used the
two sections of the old manual, Statements and SQL control statements,
at completely different points in the development, testing, deployment,
support cycle.
Nov 12 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

33
4745
by: coosa | last post by:
I have a table: ---------------------------------------------------- CREATE TABLE CATEGORY ( CATEGORY_ID INTEGER IDENTITY(1,1) NOT NULL, CATEGORY_NAME VARCHAR(40) NOT NULL, PARENT_CATEGORY_ID INTEGER, CATEGORY_ICON IMAGE, DEPTH INTEGER,
9
3195
by: Raquel | last post by:
Following is a simple trigger definition: CREATE TRIGGER TRIG_EMPLOYEE_1 AFTER UPDATE OF SALARY ON DB2ADMIN.EMPLOYEE FOR EACH STATEMENT MODE DB2SQL CALL DB2ADMIN.SQLSP10( ) This gives an error: SQL0104N An unexpected token "CALL" was found following "ATEMENT MODE
9
2852
by: tedlaraghu | last post by:
Hi every one, I am trying to update time_added column when ever there is an update on the table. ALTER TABLE emp ADD (time_added timestamp); UPDATE emp SET time_added = sysdate; When ever i issue any update stmt like these,automatically time_added column should also be update. I tried creating a trigger,but I...
0
935
by: dmaier | last post by:
Below is a trigger that was working in SQL 2003 but will not work in Server 2005. All the fields are the same. Any help would be greatly appreciated. Dan USE GO /****** Object: Trigger . Script Date: 10/04/2007 08:03:49 ******/ SET ANSI_NULLS ON GO
1
1133
by: umesh049 | last post by:
hello I want to update in one trigger the tables in to another schema but it doesn't work but when i select data from sql prompt it works fine. can any body help me. thanks. CREATE OR REPLACE TRIGGER Product_Detail_TR
1
2173
by: tb1 | last post by:
Hi, I have written a trigger and now im getting this error when i try to add it to my database. ERROR 1415 (0A000): Not allowed to return a result set from a trigger What does that mean?
1
2858
by: amijai11 | last post by:
I am getting following error for a trigger, please let me know if anyone knows how to fix the problem. Thks in advance for the help. SQLCODE = -20100, ERROR: AN ERROR OCCURRED WHEN BINDING A TRIGGERED SQL STATEMENT. INFORMATION RETURNED: SECTION NUMBER : 2 SQLCODE -104, SQLSTATE 42601, AND MESSAGE TOKENS -,TABLE STATEMENT , . SCROLL...
1
4217
by: indikamaligaspe | last post by:
Hi all, I am trying to get a PL/TCL trigger to update an audit table working. The problem is when I create the trigger on an exiting table, I get the following error "ERROR: can't read "tgname": no such variable CONTEXT: can't read "tgname": no such variable while executing ....." If I drop the table and then recreate the table and...
3
1689
by: Kev37Barrie | last post by:
I am trying to do a multi record update on a table but get an error from the update trigger. Update - ALTER PROCEDURE . @ApplicationId int, @Cancelled bit, @LastUpdatedBy varchar(151)
0
7615
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main...
0
7539
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language...
0
7819
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. ...
0
8055
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that...
0
7897
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the...
0
3589
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in...
1
2030
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
1
1149
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
858
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.