如何将具有默认值的列添加到SQL Server 2000/SQL Server 2005中的现有表中?
我希望这是关于如何使用SQL语句检查SQL Server 2000/2005中是否存在表的最终讨论.
当谷歌找到答案时,你会得到很多不同的答案.这样做是否有正式/后向和前向兼容的方式?
这有两种可行的方法.这两者中哪一个是标准/最佳方式?
第一种方式:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
Run Code Online (Sandbox Code Playgroud)
第二种方式:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
Run Code Online (Sandbox Code Playgroud)
MySQL提供简单
SHOW TABLES LIKE '%tablename%';
Run Code Online (Sandbox Code Playgroud)
声明.我正在寻找类似的东西.
我将使用一个具体的,但假设的例子.
每个订单通常只有一个订单项:
命令:
OrderGUID OrderNumber
========= ============
{FFB2...} STL-7442-1
{3EC6...} MPT-9931-8A
Run Code Online (Sandbox Code Playgroud)
了LineItem:
LineItemGUID Order ID Quantity Description
============ ======== ======== =================================
{098FBE3...} 1 7 prefabulated amulite
{1609B09...} 2 32 spurving bearing
Run Code Online (Sandbox Code Playgroud)
但偶尔会有一个包含两个订单项的订单:
LineItemID Order ID Quantity Description
========== ======== ======== =================================
{A58A1...} 6,784,329 5 pentametric fan
{0E9BC...} 6,784,329 5 differential girdlespring
Run Code Online (Sandbox Code Playgroud)
通常在向用户显示订单时:
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN LineItems
ON Orders.OrderID = LineItems.OrderID
Run Code Online (Sandbox Code Playgroud)
我想在订单上显示单个项目.但是,由于此偶尔包含两个(或更多)商品的订单,订单将显示为重复:
OrderNumber Quantity Description
=========== ======== ==================== …Run Code Online (Sandbox Code Playgroud) 我需要为表格中的每一行添加一个不同的随机数.以下看似明显的代码对每行使用相同的随机值.
SELECT table_name, RAND() magic_number
FROM information_schema.tables
Run Code Online (Sandbox Code Playgroud)
我想从中获得INT或FLOAT.故事的其余部分是我将使用这个随机数来创建一个已知日期的随机日期偏移,例如从开始日期偏移1-14天.
这适用于Microsoft SQL Server 2000.
我意识到参数化SQL查询是构建包含用户输入的查询时消毒用户输入的最佳方式,但我想知道使用用户输入并转义任何单引号并用单引号包围整个字符串有什么问题.这是代码:
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
Run Code Online (Sandbox Code Playgroud)
用户输入的任何单引号都被双单引号替换,这消除了用户结束字符串的能力,因此他们可能键入的任何其他内容(例如分号,百分号等)都将成为字符串的一部分而不是实际上作为命令的一部分执行.我们使用的是Microsoft SQL Server 2000,我相信单引号是唯一的字符串分隔符,也是逃避字符串分隔符的唯一方法,因此无法执行用户键入的任何内容.
我没有看到任何方法发起针对此的SQL注入攻击,但我意识到,如果这是像我看来一样的防弹,其他人会想到它,这将是常见的做法.我的问题是:这段代码有什么问题?有没有人知道通过这种清理技术获得SQL注入攻击的方法?利用此技术的示例用户输入将非常有用.
更新:
感谢大家的回答; 几乎我在研究中遇到的所有信息都出现在这个页面的某个地方,这表明那些在忙碌的日子里抽出时间帮助我解决这个问题的人的智慧和技巧.
我还没有接受任何答案的原因是我仍然不知道如何有效地针对此代码启动SQL注入攻击.有些人建议反斜杠会转义一个单引号而另一个引用字符串结束,以便字符串的其余部分作为SQL命令的一部分执行,我意识到这个方法可以将SQL注入一个mySQL数据库,但在MS SQL 2000中,唯一的方法(我能够找到)逃避单引号是另一个单一的qoute; 反斜杠不会这样做.除非有办法停止单引号的转义,否则其余的用户输入都不会被执行,因为它将全部作为一个连续的字符串.
我知道有更好的方法来消毒输入,但我真的更有兴趣了解为什么我上面提供的方法不起作用.如果有人知道对这种清理方法进行SQL注入攻击的任何特定方法,我很乐意看到它.
有没有一种直接的方法来使用SQL查找最后一次出现的字符串的索引?我现在正在使用SQL Server 2000.我基本上需要.NET System.String.LastIndexOf方法提供的功能.一个小的谷歌搜索透露了这个 - 函数来检索最后一个索引 - 但如果你传入一个"文本"列表达式,这不起作用.在其他地方找到的其他解决方案只有在您搜索的文本长度为1个字符时才起作用.
我可能不得不做一个功能.如果我这样做,我会在这里发布,所以你们大家可以看看它,也许可以利用它.
使用SQL Server 2000,我如何获得当年的第一个和最后一个日期?
预期产出:
01/01/2012 和 31/12/2012
我通过编写代码而不是使用GUI在Microsoft SQL Server 2000中创建一个新表,我正在尝试学习如何"手动方式".
这是我实际使用的代码,它工作正常:
CREATE TABLE "attachments"
(
"attachment_id" INT NOT NULL,
"load_date" SMALLDATETIME NOT NULL,
"user" VARCHAR(25) NOT NULL,
"file_name" VARCHAR(50) NOT NULL,
CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"),
CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"),
CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE())
)
Run Code Online (Sandbox Code Playgroud)
我已经自己指定了主键,外键和检查约束,因为这样我可以为它们定义一个名称,否则将它们声明为内联会使SQL Server生成一个随机名称,而我并不"喜欢"它.
当我尝试声明默认值约束时出现问题:查看Internet上的信息以及Microsoft SLQ Server Management Studio如何创建它,我了解它可以内联和单独创建:
"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()
Run Code Online (Sandbox Code Playgroud)
要么
CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
Run Code Online (Sandbox Code Playgroud)
内联方法工作正常,但它像往常一样为constaint生成一个随机名称,独立方法抛出错误,说Incorrect syntax near 'FOR'..
此外,如果我创建表然后ALTER它,该命令工作:
ALTER TABLE "attachments"
ADD CONSTRAINT "df_load_date" …Run Code Online (Sandbox Code Playgroud) 我从旧数据库生成脚本,创建了一个新数据库并从旧数据库导入了所有数据.然而,到目前为止,没有用户拥有存储过程的执行权限.我知道我可以使用
GRANT EXECUTE ON [storedProcName] TO [userName]
Run Code Online (Sandbox Code Playgroud)
但是,如果它只是一些程序,那么我有大约100个,那么对于特定用户授予所有这些权限的最简单方法是什么?
提前致谢.
有谁知道在SQL Server 2000数据库中列出打开事务的任何方法?
我知道我可以查询sys.dm_tran_session_transactionsSQL 2005(及更高版本)数据库版本的视图,但这在SQL 2000上不可用.
sql-server-2000 ×10
sql-server ×8
sql ×6
t-sql ×5
constraints ×1
default ×1
sanitization ×1
search ×1
security ×1
string ×1
transactions ×1