澳门十大赌场最新排名 > 澳门十大赌场 > Sqlserver数据库中,使用动态SQL创建数据库

原标题:Sqlserver数据库中,使用动态SQL创建数据库

浏览次数:140 时间:2019-08-01

问题来源:最近有同事需要执行批量删除语句。根据他提供的业务需求,推荐他使用“TRUNCATE TABLE”语句。但使用该语句需要 ALTER权限,这与执行用户的角色不符。

/*其实我也搞不懂为什么要用SQL来创建,明明SQL Server有图形化创建数据库多省事啊!*/
USE master;

面向程序员的数据库访问性能优化法则

解决办法:使用EXECUTE AS语句修改执行权限。代码如下:

​DECLARE @sqlstr nvarchar(max)
/*定义一个变量*/
DECLARE @database_name nvarchar(20) = 'MyDB';
/*这里输入需要创建的数据库名*/
DECLARE @file_name_d nvarchar(200) = CONVERT(sysname, SERVERPROPERTY('InstanceDefaultDataPath'))
/*这里是利用SQL Server的serverproperty这个函数来获取当前实例的默认数据文件位置和日志文件位置*/
DECLARE @file_name_l nvarchar(200) = CONVERT(sysname, SERVERPROPERTY('InstanceDefaultLogPath'))
/*微软官方参数介绍

IF DB_ID('MyDB') IS NOT NULL
    BEGIN
        PRINT 'Database ' @database_name ' already exists';  --判断MyDB是否存在,存在的话就干掉,我也不知道为什么要这么写
        DROP DATABASE MyDB; --还是手动删除吧,不使用脚本删除
    END

 

ALTER PROCEDURE [dbo].[sp_TruncateTable] 
    @TableName varchar(200) 
    WITH EXECUTE AS SELF
AS 
BEGIN 
    --打印出当前执行上下文用户
    SELECT  nt_username, loginame 
    FROM sys.sysprocesses 
    WHERE spid = @@SPID

    SET NOCOUNT ON; 
    DECLARE @TruncateSql nvarchar(2000);
    SET @TruncateSql = 'TRUNCATE TABLE '   @TableName 
    EXEC (@TruncateSql) 
END

ELSE
    
    BEGIN
        SET @sqlstr= 'CREATE DATABASE' ' ' @database_name ' '
        SET @sqlstr =  @sqlstr 'ON'
        SET @sqlstr =  @sqlstr '('    
        SET @sqlstr =  @sqlstr 'NAME = ' ' ' @database_name '_dat,'
        SET @sqlstr =  @sqlstr 'FILENAME = ' '''' @file_name_d '' @database_name '.mdf'','
        SET @sqlstr =  @sqlstr 'SIZE = 10,'
        SET @sqlstr =  @sqlstr 'MAXSIZE = 50,'
        SET @sqlstr =  @sqlstr 'FILEGROWTH = 5'
        SET @sqlstr =  @sqlstr ')'
        SET @sqlstr =  @sqlstr 'LOG ON'
        SET @sqlstr =  @sqlstr '(   NAME = ' ' ' @database_name '_log,'
        SET @sqlstr =  @sqlstr 'FILENAME = ' '''' @file_name_l '' @database_name '.ldf'','
        SET @sqlstr =  @sqlstr 'SIZE = 5MB,'
        SET @sqlstr =  @sqlstr 'MAXSIZE = 25MB,'
        SET @sqlstr =  @sqlstr 'FILEGROWTH = 5MB'
        SET @sqlstr =  @sqlstr ');'
        Print (@sqlstr) -- 如果不想直接执行,使用使用print参数先把命令打印出来
        --exec (@sqlstr);   -- 执行直接上面生成的动态SQL
        --Print 'Datbaase ' @database_name ' has been created using default data and log location in the server configuration!!'
        /*打印已经创建成功的数据库名字*/
        --Print 'Data file location = ' @file_name_d @database_name '.mdf';
        /*打印创建的数据库的数据文件路径*/
        --Print 'Log file location = ' @file_name_l @database_name '.ldf';
        /*打印创建的数据库的日志文件路径*/
    END

特别说明:

 

1、  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识;

通过打印出来的loginame可以看出,执行用户信息已经被修改。

2、  本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也可以参考,但许多观点不适合于KV数据库或内存数据库或者是基于SSD技术的数据库;

3、  本文未深入数据库优化中最核心的执行计划分析技术。

 

读者对像:

开发人员:如果你是做数据库开发,那本文的内容非常适合,因为本文是从程序员的角度来谈数据库性能优化。

架构师:如果你已经是数据库应用的架构师,那本文的知识你应该清楚90%,否则你可能是一个喜欢折腾的架构师。

DBA(数据库管理员):大型数据库优化的知识非常复杂,本文只是从程序员的角度来谈性能优化,DBA除了需要了解这些知识外,还需要深入数据库的内部体系架构来解决问题。

 

引言

在网上有很多文章介绍数据库优化知识,但是大部份文章只是对某个一个方面进行说明,而对于我们程序员来说这种介绍并不能很好的掌握优化知识,因为很多介绍只是对一些特定的场景优化的,所以反而有时会产生误导或让程序员感觉不明白其中的奥妙而对数据库优化感觉很神秘。

很多程序员总是问如何学习数据库优化,有没有好的教材之类的问题。在书店也看到了许多数据库优化的专业书籍,但是感觉更多是面向DBA或者是PL/SQL开发方面的知识,个人感觉不太适合普通程序员。而要想做到数据库优化的高手,不是花几周,几个月就能达到的,这并不是因为数据库优化有多高深,而是因为要做好优化一方面需要有非常好的技术功底,对操作系统、存储硬件网络、数据库原理等方面有比较扎实的基础知识,另一方面是需要花大量时间对特定的数据库进行实践测试与总结。

作为一个程序员,我们也许不清楚线上正式的服务器硬件配置,我们不可能像DBA那样专业的对数据库进行各种实践测试与总结,但我们都应该非常了解我们SQL的业务逻辑,我们清楚SQL中访问表及字段的数据情况,我们其实只关心我们的SQL是否能尽快返回结果。那程序员如何利用已知的知识进行数据库优化?如何能快速定位SQL性能问题并找到正确的优化方向?

本文由澳门十大赌场最新排名发布于澳门十大赌场,转载请注明出处:Sqlserver数据库中,使用动态SQL创建数据库

关键词: mg4155娱乐

上一篇:自增长字段值的连续递增实现

下一篇:没有了