Я предполагаю, что у вас есть проблемы с захватом ответа. discord.py
перегружает синтаксис function(args, *, kwargs)
для команд, так что один аргумент после *
является текстом остальной части сообщения.
from discord.ext.commands import Bot
bot = Bot('#')
my_user_id = ""
# You can get your id through the discord client, after activating developer mode.
@bot.command(pass_context=True)
async def survey(ctx):
await bot.send_message(ctx.message.author, "What's your name?")
@bot.command(pass_context=True)
async def respond(ctx, *, response):
owner = await bot.get_user_info(my_user_id)
await bot.send_message(owner, "{} responded: {}".format(ctx.message.author.name, response))
bot.run("token")
Это вопрос о цепях владения.
См. «Книги в Интернете»> Цепочки прав собственности: https://technet.microsoft.com/en-us/library/ms188676 (v = sql.105 ) .aspx
Сначала мы можем продемонстрировать, как работают цепочки прав без EXECUTE AS внутри хранимой процедуры, тогда мы можем увидеть, как это работает с EXECUTE AS.
Создайте две таблицы и вставьте данные.
CREATE TABLE dbo.T1 (id int IDENTITY(1,1));
CREATE TABLE dbo.T2 (id int IDENTITY(1,1));
INSERT INTO dbo.T1 DEFAULT VALUES;
INSERT INTO dbo.T2 DEFAULT VALUES;
Создайте двух пользователей.
CREATE USER U1 WITHOUT LOGIN;
CREATE USER U2 WITHOUT LOGIN;
Измените право собственности на таблицу T2 на пользователя U2.
ALTER AUTHORIZATION ON OBJECT::dbo.T2 TO U2;
Убедитесь, что мы изменили право собственности.
SELECT name, principal_id
FROM sys.tables
WHERE name IN (N'T1', N'T2');
Демонстрировать, что пользователь U1 не имеет разрешения SELECT в таблице T1 или T2 .
EXECUTE AS USER = 'U1';
SELECT * FROM dbo.T1;
SELECT * FROM dbo.T2;
REVERT
Создайте две хранимые процедуры и разрешите пользователю U1 выполнять оба.
CREATE PROCEDURE dbo.P1
AS
SELECT * FROM dbo.T1;
GO
CREATE PROCEDURE dbo.P2
AS
SELECT * FROM dbo.T2;
GO
GRANT EXECUTE ON dbo.P1 to U1;
GRANT EXECUTE ON dbo.P2 to U1;
Выполнить P1 как пользователь U1. Это работает, потому что существует цепочка неразрывной связи. P1 и T1 имеют одного и того же владельца (который является владельцем схемы dbo). В этом случае проверка разрешений внутри хранимой процедуры пропускается.
EXECUTE AS USER = 'U1';
EXEC dbo.P1;
REVERT
Выполнить процедуру P2 как пользователь U1. Это терпит неудачу, так как цепочка прав собственности нарушена, и поэтому проверяются разрешения внутри хранимой процедуры. P2 и T2 имеют разных владельцев.
EXECUTE AS USER = 'U1';
EXEC dbo.P2;
REVERT
Затем продемонстрируйте, как хранятся хранимые процедуры, когда они содержат EXECUTE AS.
Создайте еще две хранимые процедуры.
CREATE PROCEDURE dbo.P1A
AS
EXECUTE AS USER = 'U1';
SELECT * FROM dbo.T1;
REVERT
GO
CREATE PROCEDURE dbo.P2A
AS
EXECUTE AS USER = 'U1';
SELECT * FROM dbo.T2;
REVERT
GO
Выполните P1A, и это работает. Непрерывная цепочка выполнения, поэтому разрешения внутри хранимой процедуры не проверяются.
EXEC dbo.P1A;
Выполнить P2A, и это не удается. Неверная цепочка выполнения, поэтому проверяются разрешения внутри хранимой процедуры.
EXEC dbo.P2A;
Обратите внимание, что существует инструкция EXECUTE AS, которую мы используем в этих примерах. Существует также предложение EXECUTE AS, которое используется с хранимыми процедурами, функциями и триггерами.
Электронная документация> EXECUTE AS (Transact-SQL): https://msdn.microsoft.com /en-us/library/ms181362.aspx
Книги в Интернете> EXECUTE AS Clause (Transact-SQL): https://msdn.microsoft.com/en-GB/ библиотека / ms188354.aspx
Это нормальное поведение из-за «сцепления с собственностью»
. Внутри процедур разрешения не проверяются, если ссылки, на которые ссылаются, имеют одинаковую АВТОРИЗАЦИЮ в качестве хранимой процедуры. В этом случае они оба находятся в схеме «dbo», поэтому разрешения не проверяются. Это включает разрешения DENY
create proc dbo.newproc2
with EXECUTE AS CALLER
as
select * from dbo.newtable
GO
GRANT EXEC ON dbo.newproc2 TO newuser
EXEC as user = 'newuser'
exec dbo.newproc2
REVERT
GO
DENY SELECT ON dbo.newtable TO newuser
exec dbo.newproc
GO
EXEC as user = 'newuser'
exec dbo.newproc2
REVERT
GO