![]() |
Sources Sybase | ![]() |
| Mis à jour le 28 juillet 2006 |
| Sommaire |
| ASE - Adaptive Server Enterprise |
/* Auteur : Michael Pepper
* Date : 28.7.2006
* Desc : Retourne le DDL de suprpession et de création des indexes d'une table
*/
-- Un curseur sur tous les indexes des tables "user" dans la base courante:
declare ixcsr cursor
for select name, id, indid from sysindexes
where id in (select id from sysobjects where type = 'U')
go
set nocount on
declare @name varchar(32)
, @id int
, @indid int
, @colid int
declare @cmd varchar(300)
, @tab varchar(32)
, @colname varchar(32)
, @colorder varchar(32)
open ixcsr
fetch ixcsr into @name, @id, @indid
while @@sqlstatus = 0
begin
select @tab = object_name(@id)
-- la commande de drop... celle-ci est triviale!
select @cmd = "drop index " + @tab + "." + @name
print "%1!", @cmd
-- on construit la commande de creation de facon iterative
select @colid = 1
select @cmd = "create index " + @name + " on " + @tab + "("
while @colid <= 31
begin
select @colname = index_col(@tab, @indid, @colid)
, @colorder = index_colorder(@tab, @indid, @colid)
-- si le nom est null c'est qu'on a traite toutes les colonnes de
-- l'indexe
if @colname is null
goto LAST_COLUMN
if @colid > 1
select @cmd = @cmd + ", "
select @cmd = @cmd + @colname + " " + @colorder
select @colid = @colid + 1
end
LAST_COLUMN:
select @cmd = @cmd + ")"
print "%1!", @cmd
fetch ixcsr into @name, @id, @indid
end
close ixcsr
deallocate cursor ixcsr
go |
CREATE PROCEDURE hs_ClearHistory (@Dte datetime )
AS
/* Auteur : Fabien Celaia
* Date : 7.5.2003
* Desc : Supprime les anciennes valeurs de toutes les tables ayant une colonne Datetime appelée Timestamp.
* Très utile pour les tables générées par le Historical Serveur
*/
BEGIN
/* Scan de toutes les tables utilisateur ncluant un Timestamp dans la base courante */
declare tbl_cur cursor for
select o.name
from sysobjects o inner join syscolumns c
on o.id = c.id
where o.type="U"
and c.name = "Timestamp"
declare @sql varchar(100), @t varchar(30)
open tbl_cur
fetch tbl_cur into @t
while @@sqlstatus <> 2
begin
checkpoint /* nécessaire avant chaque command delete compte tenu d la taille des tuples
et de la petite taille du journal de transactions */
select @sql = "delete "+ @t +" where Timestamp <= '"+convert(varchar(20), @Dte)+"'"
execute (@sql) /* execution de la requête SQL */
select @sql=convert(varchar(10),@@rowcount) /* Récupération du nombre de tupels impactés */
print "%1! lines deleted from %2!.",@sql,@t /* Affichage informationnel */
fetch tbl_cur into @t
end
close tbl_cur
deallocate cursor tbl_cur
END
|
create proc sp_ForeignKey (@TBL varchar(30))
as
/* Auteur : Fabien Celaia
* Date : 7.5.2003
* Desc : Détecte toutes les clés étrangères pointant sur la table passée en paramètre
* et affiche les ordres DDL pour supprimer et recréer les contraintes.
*/
BEGIN
SELECT object_name(r.constrid) CONST,
object_name(r.tableid) TBL,
c1.name COL,
object_name(r.reftabid) TBL_REF,
c2.name COL_REF
INTO #HIST_CONST
FROM sysreferences r,
syscolumns c1,
syscolumns c2
WHERE r.keycnt=1
AND (object_name(r.reftabid)=@TBL OR object_name(r.reftabid)=@TBL)
AND c1.id=r.tableid
AND c2.id=r.reftabid
AND r.pmrydbid=r.frgndbid
AND r.frgndbid=db_id()
AND c1.colid=fokey1
AND c2.colid=refkey1
SELECT "ALTER TABLE "+TBL+" DROP CONSTRAINT "+CONST
FROM #HIST_CONST
SELECT "ALTER TABLE "+TBL+" ADD CONSTRAINT "+CONST+" FOREIGN KEY ("+COL+") REFERENCES "+TBL_REF+ " ("+COL_REF+")"
FROM #HIST_CONST
END
|
create proc sp__cpu
AS
/* Auteur : Fabien Celaia
* Date : 11.01.2002
* Desc : Affiche les processus en train de consommer des ressources
* Param : -
*/
select convert(char(4), fid) Fam,
convert(char(4), spid) Spid,
convert(char(4), cpu) CPU,
substring(suser_name(suid),1,15) "Users",
substring(db_name(dbid),1,15) DB,
convert(char(12), cmd) Command,
convert(char(12), program_name) Program,
convert(char(4), blocked) Blk
from master..sysprocesses
where cmd not like "AWAITING%"
and spid <> @@spid
and suid > 0
order by cpu desc
|
create proc sp__showplan AS /* * Auteur : Fabien Celaia * Date : 8/03/2002 * Desc : Affiche tous les plan d'exécution actifs * Parm : - */ BEGIN set nocount on declare @i_spid integer declare @c_spid char(5), @user varchar(30), @host varchar(30), @appl varchar(30) declare @cmd varchar(30), @dbname varchar(30) declare busy_cur cursor for select spid from master..sysprocesses where cmd not like "AWAITING%" and spid <> @@spid and suid > 0 open busy_cur fetch busy_cur into @i_spid while @@sqlstatus <>2 begin select @c_spid = convert(char(5), @i_spid) select @user=suser_name(suid), @dbname=db_name(dbid), @host=hostname, @appl = program_name, @cmd = cmd from master..sysprocesses where spid=@i_spid print "**************************************************************************" print "* Plan d'exécution pour spid no %1!", @c_spid print "* Login : %1!", @user print "* Application : %1!", @appl print "* Machine : %1!", @host print "* Base de données : %1!", @dbname print "* Commande : %1!", @cmd print "**************************************************************************" print "" if exists (select 1 from master..sysprocesses where fid = @i_spid and spid <> @i_spid) begin print " Worker processes" print " ----------------" select spid, db_name(dbid) DB, status, cmd from master..sysprocesses where fid = @i_spid and spid <> @i_spid print "" end else print "Pas de worker process" exec sp_showplan @i_spid, null,null,null fetch busy_cur into @i_spid end close busy_cur deallocate cursor busy_cur END |
create proc sp__createDumpDevice (@dumpPath varchar(100))
AS
/*
* Auteur : Fabien Celaia
* Date : 11/05/2002
* Desc : Supprime tous les dump devices existant et le recrée, par bloc de 2Go
* Parm : @dumpPath : Répertoire racine pour les fichiers de sauvegarde
*/
begin
declare cur_db cursor for
select db_name(dbid) DBName, convert(int,sum(size/512)/2048.0)+1 NumDev
from master..sysusages
group by dbid
for read only
declare cur_dev cursor for
select name
from master..sysdevices
where low = 0
and status = 16
and (name like "%_db_dmp_"
or name like "%_tran_dmp_")
for update
declare @num int, @tot int
declare @db varchar(30), @dumpdev varchar(255), @dumpname varchar(30)
open cur_dev
fetch cur_dev into @dumpname
while @@sqlstatus<>2
begin
exec sp_dropdevice @dumpname
fetch cur_dev into @dumpname
end
close cur_dev
deallocate cursor cur_dev
open cur_db
fetch cur_db into @db, @num
select @tot=@num
while @@sqlstatus <> 2
begin
while @num > 0
begin
select @dumpname = @db+'_db_dmp'+convert(varchar(2), @num)
select @dumpdev=@dumpPath+@db+"_db_"+convert(varchar(2), @num)+
"of"+convert(varchar(2), @tot)+".dmp"
exec sp_addumpdevice 'disk', @dumpname,@dumpdev
select @num=@num-1
end
fetch cur_db into @db, @num
select @tot=@num
end
close cur_db
deallocate cursor cur_db
end
|
create proc sp__dbuser (@db varchar(30)=NULL) AS /* * Auteur : Fabien Celaia * Date : 3.3.2002 * Desc : Affiche la liste des utilisateurs utilisant une base de donnée spécifique * Parm : @db = Nom de la base (optionnel) * Return : Nombre d'utilsiateurs * -1 si la abse n'existe pas */ begin set nocount on declare @i int if @db is null select @db=db_name() else if not exists(select name from master..sysdatabases where name = @db) begin Print"The database %1! does not exist in ASE %2!", @db,@@servername return -1 end select @db "Database" print "" /* Number of users */ select @i=count(spid) from master..sysprocesses where dbid = db_id(@db) and suid > 0 if @i = 0 begin print "" print "This database is unused" print"" end else begin /* List of the users */ declare @snum varchar(4) select @snum = convert(varchar(4), @i) print "" print "%1! user(s) found in database %2!, server %3! ",@snum, @db, @@servername print "" select spid, suser_name(suid) users , cmd, program_name from master..sysprocesses where dbid = db_id(@db) and suid > 0 /* Informational warning if the current user is in the database */ if exists (select * from master..sysprocesses where spid=@@spid and dbid=db_id(@db)) begin print "" print "FYI : YOU currently are one of the users of the database %1!, server %2!!", @db, @@servername print "" end end return @i end |
create procedure sp__dumpdevice (@devname char(30)=NULL) AS /* * Auteur : Fabien Celaia * Date : 11/01/2002 * Desc : Liste des dump devices * Parm : dump device spécifique (optional) * Return : Nombre de dump devices */ begin set nocount on select "Device Name"=substring(d.name, 1,20), "Physical Name"= substring(d.phyname,1,50) from master.dbo.sysdevices d where d.status & 2 != 2 and isnull(@devname,name) = name return @@rowcount end |
create proc sp__cleanuser
AS
/*
* Auteur : Fabien Celaia
* Date : 11/01/2002
* Desc : Supprime tous les utilisateurs d'une base et les recrée, pour autant qu'un login existe
* Cette SP resynchronise les suid/uid après un dump/load d'un autre ASE
* Parm : -
*/
begin
create table #TMP_USERS ( USERNAME varchar(30),
USERGROUP varchar(30))
declare @user_name varchar(30), @user_group varchar(30)
/* Fill up the temp table with the information from the existing users*/
insert #TMP_USERS
select s1.name, s2.name
from sysusers s1, sysusers s2
where s1.suid > 0 and /* exclude the groups */
s1.gid=s2.uid and
s1.name != 'dbo' /* exclude the dbo */
declare users_cur cursor for
select * from #TMP_USERS
for read only
open users_cur
fetch users_cur into @user_name, @user_group
while @@sqlstatus <> 2
begin
exec sp_dropuser @user_name
exec sp_adduser @user_name, @user_name, @user_group
fetch users_cur into @user_name, @user_group
end
close users_cur
deallocate cursor users_cur
drop table #TMP_USERS
end
|
create proc sp__dbsize (@db varchar(30) = NULL) AS /* * Author : Fabien Celaia * Date : 19.11.2002 * Desc : Affiche la taille et le taux d'occupation des bases * Parm : @db = Nom de la base (optionnel) * Return : 0 : ok * 1 : Aide affichée */ begin if convert(char(1), @db) in ( "/" ,"-") begin print "Usage : 1) sp__dbsize" print " 2) sp__dbsize MyDbName" print " 2) sp__dbsize 'A Part Of MyDbName with wildcard(s)'" return 1 end select dbid, LogSize = sum(size/(@@pagesize/4)), LogFullPercent= convert(numeric(5,2),100 * (sum(size) - sum(curunreservedpgs(dbid, lstart, unreservedpgs)))/convert(numeric(10,0), sum(size))) into #Log from master..sysusages where segmap = 4 group by dbid select dbid, DataSize = sum(size/(@@pagesize/4)), DataFullPercent= convert(numeric(5,2),100 * (sum(size) - sum(curunreservedpgs(dbid, lstart, unreservedpgs)))/convert(numeric(10,0), sum(size))) into #Data from master..sysusages where segmap=3 group by dbid select dbid, MixSize = sum(size/(@@pagesize/4)), MixFullPercent= convert(numeric(5,2),100 * (sum(size) - sum(curunreservedpgs(dbid, lstart, unreservedpgs)))/convert(numeric(10,0), sum(size))) into #Mix from master..sysusages where segmap<>4 and segmap&4 = 4 group by dbid select s.dbid, DB = convert(char(20), s.name), LogSize, DataSize, MixSize, DataFullPercent, LogFullPercent, MixFullPercent from master..sysdatabases s, #Log l, #Data d, #Mix m where s.dbid *= l.dbid and s.dbid *= d.dbid and s.dbid *= m.dbid and s.name like isnull(@db, s.name) order by s.name drop table #Data, #Log, #Mix end |
create proc sp__stat (@objectname varchar(30)=null) AS /* * Auteur : Fabien Celaia * Date : 08/03/2002 * Desc : Affiche le nombre de lignes de chaque table (ou d'une table spécifique) en se basant * sur les statistiques * Parm : @objectname (optionnel) */ begin select o.type, o.name, s.rowcnt, s.pagecnt, s.delrowcnt, s.forwrowcnt, s.emptypgcnt from sysobjects o, systabstats s where o.id = s.id and s.indid in (0,1) and o.name =isnull(@objectname,o.name) order by o.type, o.name end |
| ASA - SQL Anywhere Studio |
| ASIQ - Adaptive Server IQ |
/*
* Auteur : Fabien Celaia
* Date : 10/02/2003
* Desc : Ces divers sripts vous aident à générer les index IQ corrects pour ASIQ12,
* en générant un DDL depuis un serveur source ASE.
*/
drop proc sp_iqsyntax_table
drop proc sp_iqsyntax_index
drop proc sp_iqcompte
drop table IqCompte
go
/* Création d'une table technique.
* Il ne s'agit pas seulement d'une table de travail car vous pouvez l'utilisez continuellement
* afin d'améliorer votre modèle IQ
*/
create table IqCompte
(Tbl varchar(30) not null, -- Table name
Col varchar(30) not null, -- Column name
ColId int not null, -- Column ID
Tpe varchar(30) not null, -- ASE datatype
Lg int null, -- Size of the ASE datatype
Cpt int null, -- nr of distinct value per column
CptTable int null, -- nr of rows in the table
Uni bit not null, -- 1 if a unique constraint exist in this column
LF bit not null, -- LowFast Index : 1 if LF needs to be created in this column
HG bit not null, -- HighGroup Index : 1 if HG needs to be created in this column
HNG bit not null, -- HighNonGroup Index : 1 if HNG needs to be created in this column
CMP varchar(30) null, -- Compare Index : the name of the column to compare (must be in the same table !)
WD bit not null, -- WD Index : 1 if WD needs to be created in this column
CONSTRAINT IqCompte_PK PRIMARY KEY (Tbl, Col))
go
create proc sp_iqcompte
AS
/*
* Auteur : Fabien Celaia
* Date : 6/2/2003
* Desc : Cette SP va rempir la table IqCompte.
* Pour chaque colonne de chaque table, elle va calculer le nombre de valeurs distinctes et
* leur unicité éventuelle
* Attention : cette requête est fortement consomatrice de temps et de ressources
* (nombreux scans de table)
*/
begin
declare cur cursor for
select "insert into IqCompte select '"+ o.name+"','"+ c.name+"',"+convert(varchar(4),colid)+", '"
+ t.name+"',"+ convert(varchar(10), c.length) +", count(distinct "+c.name
+"),count(*), 0, 0, 0, 0, NULL, 0 from "+ o.name ,
"update IqCompte set Cpt = (select count(distinct "+c.name+"), CptTable = (select count(*)) from "+
o.name+") where Tbl='"+o.name+"' AND Col='"+c.name+"'",
o.name,
c.name,
c.colid
from sysobjects o,
syscolumns c,
systypes t
where o.id=c.id
and o.name not in ("IqCompte", "rs_lastcommit", "rs_threads")
and o.type="U"
and c.usertype = t.usertype
and c.usertype not in (-1, 19, 20) -- avoid the TEXT/IMAGE and Extended Datatype
declare @sqli varchar(255), @sqlu varchar(255), @tbl varchar(30), @col varchar(30), @colid int
open cur
fetch cur into @sqli, @sqlu, @tbl, @col, @colid
while @@sqlstatus <> 2
begin
if exists (select 1 from IqCompte where Tbl = @tbl and Col = @col)
execute (@sqlu) -- refresh
else
execute (@sqli) -- insert
fetch cur into @sqli, @sqlu, @tbl, @col, @colid
end
close cur
deallocate cursor cur
/* Add the TEXT/IMAGE and Extended Datatype */
insert into IqCompte
select o.name,
c.name,
c.colid,
t.name,
c.length, NULL,NULL, 0, 0, 0, 0, NULL, 0
from sysobjects o,
syscolumns c,
systypes t
where o.id=c.id
and o.name not in ("IqCompte", "rs_lastcommit", "rs_threads")
and o.type="U"
and c.usertype = t.usertype
and c.usertype in (-1, 19, 20)
and not exists (select * from IqCompte where Tbl = o.name and Col = c.name)
declare indidcur cursor
for select distinct object_name(i.id),
index_col(object_name(i.id), i.indid, 1)
from sysindexes i, sysobjects o
where i.status & 2 = 2
and i.indid < 255
and o.id = i.id
and o.type="U"
and o.name not in ("IqCompte", "rs_lastcommit", "rs_threads")
open indidcur
fetch indidcur into @tbl, @col
while @@sqlstatus <> 2
begin
update IqCompte
set Uni = 1
where Tbl = @tbl
and Col = @col
fetch indidcur into @tbl, @col
end
close indidcur
deallocate cursor indidcur
update IqCompte set HG=1, Uni=1 where Cpt=CptTable and Cpt > 0 -- primary keys
update IqCompte set Tpe='numeric' where Tpe in ('float', 'double', 'floatn')
update IqCompte set LF = 1 where Cpt <= 1500
update IqCompte set HG = 1 where Cpt > 1500
update IqCompte set HNG = 1 where Cpt > 1500
-- update IqCompte set WD = 1 where Tpe likke "%char%" and Lg between 8 and 32747
end
go
create proc sp_iqsyntax_index
AS
/*
* Auteur : Fabien Celaia
* Date : 10/2/2003
* Desc : Génération du DDL des indexes et joints en se basant sur IqCompte.
*/
begin
select "create "+ case Uni when 1 then "UNIQUE" end +" LF index "+Tbl+"_"+Col+"_LF ON "+Tbl
+"("+Col+")" LowFast_index
from IqCompte
where LF=1
select "create "+ case Uni when 1 then "UNIQUE" end +" HG index "+Tbl+"_"+Col+"_HG ON "+Tbl
+"("+Col+")" HighGroup_index
from IqCompte
where HG=1
select "create HNG index "+Tbl+"_"+Col+"_HNG ON "+Tbl+"("+Col+")" HighNonGroup_index
from IqCompte
where HNG=1
select "create WD index "+Tbl+"_"+Col+"_WD ON "+Tbl+"("+Col+")" Word_Index
from IqCompte
where WD=1
select "create CMP index "+Tbl+"_"+Col+"_CMP ON "+Tbl+"("+Col+","+CMP+")" Compare_index
from IqCompte
where CMP is not null
SELECT "CREATE JOIN INDEX "+ object_name(r.constrid)+ " FOR "+ object_name(r.tableid)
+" FULL OUTER JOIN "+ object_name(r.reftabid)+ " ON "+ co1.name+" = "+co2.name Join_index
FROM sysreferences r, syscolumns co1, syscolumns co2
where r.keycnt=1
and r.frgndbid = r.pmrydbid
and r.tableid = co1.id
and r.reftabid = co2.id
and r.fokey1 = co1.colid
and r.refkey1 =co2.colid
end
go
create proc sp_iqsyntax_table (@Tbl varchar(30), @pw varchar(30)=NULL)
AS
/*
* Auteur : Fabien Celaia
* Date : 15/4/2003
* Desc : Génération des commandes de chargement des indexes et joints en se basant sur IqCompte.
*/
begin
declare cur cursor for select Col, Tpe, Cpt from IqCompte where Tbl=@Tbl order by ColId
declare @col varchar(30), @tp varchar(30), @cp int, @DDL varchar(1000), @LOAD varchar(1000)
declare @iDDL int, @iLOAD int, @maxpacket int
declare @LOADSHORT varchar(1000), @BCP varchar(1000)
open cur
fetch cur into @col, @tp, @cp
select @DDL="CREATE TABLE "+@Tbl +"(
"
select @LOAD="LOAD TABLE "+@Tbl+"(
"
while @@sqlstatus <> 2
begin
select @DDL = @DDL + @col+" "+@tp
if @cp > 0
select @DDL=@DDL+" IQ UNIQUE ("+convert(varchar(10), @cp)+")"
select @DDL=@DDL+",
"
select @LOAD = @LOAD + @col+" '~' NULL ('NULL','null'),
"
fetch cur into @col, @tp, @cp
end
select @iDDL=datalength(@DDL), @iLOAD=datalength(@LOAD)
select @DDL=substring(@DDL,1,@iDDL-2)+") ;"
select @LOAD=substring(@LOAD,1,@iLOAD-26)+" '\x0a' NULL ('NULL', 'null')) from "+@Tbl
+".bcp ESCAPES OFF QUOTES OFF WITH CHECKPOINT ON; COMMIT;"
select @LOADSHORT="INSERT INTO "+@Tbl+" LOCATION '"+@@servername+"."+db_name()+"' {select * from "+@Tbl+"};"
select @BCP="bcp "+db_name()+".."+@Tbl+" out "+@Tbl+".bcp -U"+suser_name()+" -c -t~ -S"+@@servername
select @maxpacket = cu.value
from master..sysconfigures co inner join master..syscurconfigs cu on co.config =cu.config
where co.comment like "max network packet size"
if @maxpacket > 512
select @BCP=@BCP +" -A"+convert(varchar(4), @maxpacket)
if @pw is not null
select @BCP=@BCP +" -P"+@pw
select @DDL "DDL"
select @BCP "BCP"
select @LOAD "LOAD"
union
select @LOADSHORT "LOAD"
close cur
deallocate cursor cur
end
go
|
|