记录生活
标签 Tag : SQL Server

SQL Server 切换用户模式

<Category: SQL Server> 发表评论
在sql server中,数据库不能同时为单用户模式和只供 dbo 使用模式
可以通过使用 alter database 命令来切换使用:
alter database DatabaseName set single_user
该命令限制用户只能逐个访问数据库
alter database DatabaseName set restricted_user
该命令限制只有 db_owner、dbcreator 或 sysadmin 角色的成员才能访问数据库
alter database DatabaseName set multi_user
该命令将数据库的访问权限返回其一般运行状态

在sql server中,数据库不能同时为单用户模式和只供 dbo 使用模式

可以通过使用 alter database 命令来切换使用:

alter database DatabaseName set single_user

该命令限制用户只能逐个访问数据库

alter database DatabaseName set restricted_user

该命令限制只有 db_owner、dbcreator 或 sysadmin 角色的成员才能访问数据库

alter database DatabaseName set multi_user

该命令将数据库的访问权限返回其一般运行状态

本文来自: SQL Server 切换用户模式

[转] 影响SQL server性能的关键三个方面

<Category: SQL Server> 发表评论

1 逻辑数据库和表的设计
数据库的逻辑设计、包括表与表之间的关系是优化关系型数据库性能的核心。一个好的逻辑数据库设计可以为

优化数据库和应用程序打下良好的基础。

标准化的数据库逻辑设计包括用多的、有相互关系的窄表来代替很多列的长数据表。下面是一些使用标准化

表的一些好处。

A:由于表窄,因此可以使排序和建立索引更为迅速

B:由于多表,所以多镞的索引成为可能

C:更窄更紧凑的索引

D:每个表中可以有少一些的索引,因此可以提高insert update delete等的速度,因为这些操作在索引

多的情况下会对系统性能产生很大的影响

E:更少的空值和更少的多余值,增加了数据库的紧凑性

由于标准化,所以会增加了在获取数据时引用表的数目和其间的连接关系的复杂性。太多的表和复杂的连接关系会降低服务器的性能,因此在这两者之间需要综合考虑。
定义具有相关关系的主键和外来键时应该注意的事项主要是:用于连接多表的主键和参考的键要有相同的数据类型。

阅读这篇文章的其余部分 »

本文来自: [转] 影响SQL server性能的关键三个方面

从数据库随机读取数据

<Category: SQL Server> 发表评论

示例代码:
:Select Top * From  表 Order By NewID()  
  :Select Top * From 表 Order By Rnd(ID) 
        *说明-Rnd(ID) 其中的ID是自动编号字段,可以利用其他任何数值来完成,比如用姓名字段(UserName)  Select Top 10 * From 表 Order BY Rnd(Len(UserName))
 
:Select * From 表 Order By Rand() Limit 10

本文来自: 从数据库随机读取数据

C++&OTL调用SQLServer成功

<Category: C++> 1 条评论
#include 
using namespace std;
#include 

#define _ODBC_MSSQL_2005 // Compile  3.1/OCI7
#include "otlv4.h" // include the  4 header file

//Table--Create--Script-----begin---------------------------------------------------
//USE [Matrix]
//GO
///****** Object:  Table [dbo].[tb1]    Script Date: 10/10/2009 16:40:55 ******/
//SET ANSI_NULLS ON
//GO
//SET QUOTED_IDENTIFIER ON
//GO
//SET ANSI_PADDING ON
//GO
//CREATE TABLE [dbo].[tb1](
//	[cl1] [varchar](50) COLLATE _Latin1_General_CP1_CS_AS NULL,
//	[cl2] [varchar](50) COLLATE _Latin1_General_CP1_CS_AS NULL
//) ON [PRIMARY]
//
//GO
//SET ANSI_PADDING ON
//Table--Create--Script-----end-----------------------------------------------------

otl_connect db; // connect object

void insert()
// insert rows into table
{
    //删除测试数据
   otl_stream d;
    d.open(50, // buffer size
   "truncate  Table tb1; ",db);

 otl_stream o(50, // buffer size
              "insert into tb1 values(:cl1,:cl2)",
                 // SQL statement
              db // connect object
             );
 char tmp[32];

 for(int i=1;i<=100;++i){
  sprintf(tmp,"Name%d",i);
  o<<(float)i<) ",
   db);

    //输入显示大于数字的记录数
    int var1;
    cin>>var1;
    i<>f1>>f2;
  cout<<"f1="<

本文来自: C++&OTL调用SQLServer成功

SQL Server 中 DELETE 与 TRUNCATE TABLE

<Category: SQL Server> 1 条评论

清空表数据的两种方法:

 

在SQL Server中,每一个操作SQL Server都会做一定的Log记录,比较说Insert,Update 或者Delete事件,每一个操作都会锁定行,然后对行操作做一些记录。

当一个表中的数据行很多的时候,几十万条或更多,那么删除的时候TRUNCATE TABLE则更快,它是一种快速、无日志记录的方法。TRUNCATE TABLE 与不含有 WHERE 子句的 DELETE 语句在功能上相同。但是,TRUNCATE TABLE 速度更快,并且使用更少的系统资源和事务日志资源。

与 DELETE 语句相比,TRUNCATE TABLE 具有以下优点:

所用的事务日志空间较少。

DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。

使用的锁通常较少。

当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页,而不是锁定各行。

如无例外,在表中不会留有任何页。

执行 DELETE 语句后,表仍会包含空页。例如,必须至少使用一个排他 (LCK_M_X) 表锁,才能释放堆中的空表。如果执行删除操作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。

与 DELETE 语句相同,使用 TRUNCATE TABLE 清空的表的定义与其索引和其他关联对象一起保留在数据库中。

如果这个表与其他表存在外键关联,则是删除不了的。

Msg 4712, Level 16, State 1, Line 1

Cannot truncate table xxx_primarykey' because it is being referenced by a FOREIGN KEY constraint.

本文来自: SQL Server 中 DELETE 与 TRUNCATE TABLE

【转】获取SQL Server数据库元数据的方法

<Category: SQL Server, 数据库> 发表评论

元数据简介

元数据 () 最常见的定义为“有关数据的结构数据”,或者再简单一点就是“关于数据的信息”,日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义。比如在管理、维护 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:

◆某个数据库中的表和视图的个数以及名称;

◆某个表或者视图中列的个数以及每一列的名称、数据类型、长度、精度、描述等;

◆某个表上定义的约束;

◆某个表上定义的索引以及主键/外键的信息。

下面我们将介绍几种获取元数据的方法。

获取元数据

使用系统存储过程与系统函数访问元数据

获取元数据最常用的方法是使用 Server 提供的系统存储过程与系统函数。

系统存储过程与系统函数在系统表和元数据之间提供了一个抽象层,使得我们不用直接查询系统表就能获得当前数据库对象的元数据。

常用的与元数据有关的系统存储过程有以下一些:

系统存储过程

◆sp_columns 返回指定表或视图的列的详细信息。

◆sp_databases 返回当前服务器上的所有数据库的基本信息。

◆sp_fkeys 若参数为带有主键的表,则返回包含指向该表的外键的所有表;若参数为带有外键的表名,则返回所有同过主键/外键关系与该外键相关联的所有表。

◆sp_pkeys 返回指定表的主键信息。

◆sp_server_info 返回当前服务器的各种特性及其对应取值。

◆sp_sproc_columns 返回指定存储过程的的输入、输出参数的信息。

◆sp_statistics 返回指定的表或索引视图上的所有索引以及统计的信息。

◆sp_stored_procedures 返回当前数据库的存储过程列表,包含系统存储过程。

◆sp_tables 返回当前数据库的所有表和视图,包含系统表。

常用的与元数据有关的系统函数有以下一些:

系统函数

◆COLUMNPROPERTY 返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。

◆COL_LENGTH 返回指定数据库的指定属性值,如是否处于只读模式等。

◆DATABASEPROPERTYEX 返回指定数据库的指定选项或属性的当前设置,如数据库的状态、恢复模型等。

◆OBJECT_ID 返回指定数据库对象名的标识号

◆OBJECT_NAME 返回指定数据库对象标识号的对象名。

◆OBJECTPROPERTY 返回指定数据库对象标识号的有关信息,如是否为表,是否为约束等。

◆fn_listextendedproperty 返回数据库对象的扩展属性值,如对象描述、格式规则、输入掩码等。

由于我们无法直接利用到存储过程与函数的返回结果,因此只有在我们关心的只是查询的结果,而不需要进一步利用这些结果的时候,我们会使用系统存储过程与系统函数来查询元数据。

例如,如果要获得当前服务器上所有数据库的基本信息,我们可以在查询分析器里面运行:

EXEC sp_databases
GO

在返回结果中我们可以看到数据库的名称、大小及备注等信息。

但是如果要引用这部分信息,或者存储这部分信息以供后面使用,那么我们必须借助中间表来完成这个操作:
阅读这篇文章的其余部分 »

本文来自: 【转】获取SQL Server数据库元数据的方法

创建测试数据的存储过程

<Category: SQL Server> 1 条评论

screenshot
阅读这篇文章的其余部分 »

本文来自: 创建测试数据的存储过程

查看数据库或表的空间占用情况

<Category: SQL Server> 发表评论

--查询数据库或表的空间分配情况

use   IOneDatabase
  exec   sp_spaceused     --查询数据库中的空间分配情况   

  exec   sp_spaceused   N'app_image'     --查看表的空间占用情况

---------------------------------------------------------------------------

if exists (select * from sysobjects where id = object_id(N'[dbo].[s_SpaceUsed]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[s_SpaceUsed]
GO

Create procedure s_SpaceUsed
@SourceDB	varchar(128)
as
/*
exec s_SpaceUsed 'mydb'
*/

set nocount on

declare @ varchar(128)
	create table #tables(name varchar(128))

	select @ = 'insert #tables select TABLE_NAME from ' + @SourceDB + '.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = ''BASE TABLE'''
	exec (@)

	create table #SpaceUsed (name varchar(128), rows varchar(11), reserved varchar(18), data varchar(18), index_size varchar(18), unused varchar(18))
	declare @name varchar(128)
	select @name = ''
	while exists (select * from #tables where name > @name)
	begin
		select @name = min(name) from #tables where name > @name
		select @ = 'exec ' + @SourceDB + '..sp_executesql N''insert #SpaceUsed exec sp_spaceused ' + @name + ''''
		exec (@)
	end
	select * from #SpaceUsed
	drop table #tables
	drop table #SpaceUsed
go

------------------------------------

exec s_SpaceUsed 'IOneDatabase'

Reference:http://msdn.microsoft.com/en-us/library/ms188776.aspx

http://www.nigelrivett.net/SQLAdmin/SpaceUsedAllTables.html

本文来自: 查看数据库或表的空间占用情况

有关注入的几个SQL

<Category: SQL Server> 发表评论
-----------检测------------------------
GO
DECLARE @T varchar(255),
@C varchar(255)
DECLARE Table_Cursor CURSOR FOR
Select a.name,b.name from sysobjects a,syscolumns b
where a.id=b.id and a.xtype= 'u ' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167)
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @T,@C
WHILE(@@FETCH_STATUS=0)
BEGIN print @c
FETCH NEXT FROM Table_Cursor INTO @T,@C
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor 

-----------注入-------------------------
GO
DECLARE @T VARCHAR(255),@C VARCHAR(255)
DECLARE Table_Cursor CURSOR FOR SELECT a.name,b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167)
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @T,@C
WHILE(@@FETCH_STATUS=0)
BEGIN
EXEC('UPDATE ['+@T+'] SET ['+@C+']=RTRIM(CONVERT(VARCHAR(4000),['+@C+']))+''''')
FETCH NEXT FROM Table_Cursor INTO @T,@C
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor

-----------清除-------------------------
GO
declare @t varchar(555),@c varchar(555) ,@inScript varchar(8000)
set @inScript=''
declare table_cursor cursor for select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167)
open table_cursor
fetch next from table_cursor into @t,@c
while(@@fetch_status=0)
begin
exec('update ['+@t+'] set ['+@c+']=replace(cast(['+@c+'] as varchar(8000)),'''+@inScript+''','''')' )
fetch next from table_cursor into @t,@c
end
close table_cursor
deallocate table_cursor;

本文来自: 有关注入的几个SQL

SQL Server临时表

<Category: SQL Server> 发表评论

        Server临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 断开连接时被删除。

       如果数据库会话创建了本地临时表 #temtable,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##temtable全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该 表,则SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。

      如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。

     当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。 

     临时表位于tempdb系统数据库。

本文来自: SQL Server临时表